在 JavaScript 中,函数声明和函数表达式是两种创建函数的方式。区分它们的关键在于它们的定义位置以及它们的执行时机。
函数声明 (Function Declaration)
function f() {}
- 这是语句,即函数声明。
- 特点:
-
- 以
function
关键字开头,不赋值给任何变量。 - 函数声明会在编译阶段被提升(Hoisting),意味着它可以在声明之前调用。
- 例如:
- 以
f(); // 可以调用
function f() {
console.log('This is a function declaration');
}
- 函数
f
可以在它声明之前调用,因为整个函数声明会在编译阶段提升到作用域的顶部。
函数表达式 (Function Expression)
var f = function f() {};
- 这是表达式,即函数表达式。
- 特点:
-
- 函数被赋值给一个变量(如
f
),或者作为表达式的一部分。 - 函数表达式不会被提升(Hoisting),所以它在赋值之前无法调用。
- 例如:
- 函数被赋值给一个变量(如
f();
// Uncaught ReferenceError: Cannot access 'f' before initialization
var f = function() {
console.log('This is a function expression');
};
- 在调用
f()
之前必须先定义它,否则会报错。
区分方法
- 函数声明:
function
关键字直接出现在代码的顶层(或者代码块中),这就是语句。 - 函数表达式:
function
关键字出现在赋值操作符的右边,或者作为另一个表达式的一部分,例如:
-
- 赋值给变量:
var f = function() {};
- 作为参数传递:
setTimeout(function() {}, 1000);
- 赋值给变量:
总结
- 函数声明是语句,执行时可以在声明之前调用。
- 函数表达式是表达式,只有在赋值之后才能调用。