函数声明(Function Declaration)和函数表达式(Function Expression)是两种定义函数的方式,在 JavaScript 中有一些重要的区别。以下是它们的主要区别和特点:
1. 函数声明(Function Declaration)
-
定义方式:
function myFunction() { console.log("Function Declaration"); }
-
特性:
- 提升(Hoisting):函数声明会被提升到其所在作用域的顶部。这意味着你可以在函数声明之前调用它。
- 语法:具有关键字
function
开头,后跟函数名、参数列表和函数体。 - 名称:函数声明需要一个名字。
-
示例:
console.log(myFunction()); // 输出: 'Function Declaration' function myFunction() { return "Function Declaration"; }
2. 函数表达式(Function Expression)
-
定义方式:
const myFunction = function () { console.log("Function Expression"); };
-
特性:
- 提升(Hoisting):函数表达式不会被提升,只有在函数表达式定义之后才能调用它。
- 语法:函数表达式是一个匿名函数(没有名称)或具名函数赋值给变量。
- 名称:可以是匿名函数或具名函数。匿名函数没有名字,而具名函数有名字。
-
示例:
// 错误:调用函数表达式之前不能使用 console.log(myFunction()); // TypeError: myFunction is not a function const myFunction = function () { return "Function Expression"; }; console.log(myFunction()); // 输出: 'Function Expression'
3. 具名函数表达式
具名函数表达式是函数表达式的一种形式,其中函数有一个名字。
-
定义方式:
const myFunction = function namedFunction() { console.log("Named Function Expression"); };
-
特性:
- 名称:函数有一个名字(
namedFunction
),该名称仅在函数内部可用,用于递归调用或调试。 - 提升:函数的名称不会被提升,但函数表达式本身的提升规则与普通函数表达式相同。
- 名称:函数有一个名字(
-
示例:
const myFunction = function namedFunction() { return "Named Function Expression"; }; console.log(myFunction()); // 输出: 'Named Function Expression'