JavaScript中定义函数主要有函数声明和函数表达式两种方式,二者在语法形式、执行机制、使用限制等方面存在明显差异,同时也具备函数作为JavaScript一等公民的共同特性。

相同点
函数声明和函数表达式定义出来的都是JavaScript函数对象,都具备函数的基本特性:可以接收参数、可以返回值、可以作为参数传递给其他函数、也可以作为其他函数的返回值,同时都支持函数内部的作用域隔离,拥有自己的arguments对象和this绑定规则。
不同点
1. 语法形式不同
函数声明的语法是直接使用function关键字加函数名定义,不需要赋值给变量:
// 函数声明
function add(a, b) {
return a + b;
}
函数表达式则是将函数赋值给一个变量,函数可以是匿名函数也可以是有名函数:
// 匿名函数表达式
const sum = function(a, b) {
return a + b;
};
// 有名函数表达式
const multiply = function calcMultiply(a, b) {
return a * b;
};
2. 变量提升表现不同
函数声明会被JavaScript引擎整体提升,在代码执行前就已经可以被调用,无论声明位置在函数调用之前还是之后:
// 函数调用在声明之前,依然可以正常执行
console.log(add(1, 2)); // 输出3
// 函数声明
function add(a, b) {
return a + b;
}
函数表达式本质是变量赋值,只会提升变量声明,不会提升函数赋值,在赋值之前调用会报错:
// 此时sum只是被声明,值为undefined,调用会报错
console.log(sum(1, 2)); // 报错:sum is not a function
// 函数表达式
const sum = function(a, b) {
return a + b;
};
3. 函数名的作用域不同
函数声明的函数名在当前作用域全局可用,可以在函数外部直接通过函数名调用:
function test() {
console.log('函数声明调用');
}
test(); // 正常执行
有名函数表达式的函数名只在函数内部可访问,外部无法通过该函数名调用:
const test = function innerTest() {
console.log(innerTest); // 内部可以访问innerTest,输出函数本身
};
innerTest(); // 报错:innerTest is not defined
4. 使用场景差异
函数声明适合定义需要提前调用、逻辑相对独立的工具函数,不需要依赖其他变量赋值完成就可以使用。函数表达式更适合需要动态定义函数、或者函数作为值传递的场景,比如事件回调、高阶函数的参数等,也适合配合const关键字定义不会被重新赋值的函数,避免函数被意外覆盖。
总结
函数声明和函数表达式的核心差异集中在提升机制、语法形式和函数名作用域上,相同点则是二者都属于JavaScript函数定义方式,具备函数的所有基础特性。开发者可以根据是否需要提前调用、是否需要函数名仅在内部可用等需求,选择合适的函数定义方式,提升代码的可读性和稳定性。
JavaScript函数声明函数表达式函数定义hoisting修改时间:2026-07-13 02:12:18