函数声明与函数表达式有什么区别
参考答案:
函数声明(Function Declaration)和函数表达式(Function Expression)是两种定义函数的方式,在 JavaScript 中有一些重要的区别。以下是它们的主要区别和特点:
1. 函数声明(Function Declaration)
定义方式:
javascriptfunction myFunction() { console.log('Function Declaration'); }特性:
- 提升(Hoisting):函数声明会被提升到其所在作用域的顶部。这意味着你可以在函数声明之前调用它。
- 语法:具有关键字
function开头,后跟函数名、参数列表和函数体。 - 名称:函数声明需要一个名字。
示例:
javascriptconsole.log(myFunction()); // 输出: 'Function Declaration' function myFunction() { return 'Function Declaration'; }
2. 函数表达式(Function Expression)
定义方式:
javascriptconst myFunction = function() { console.log('Function Expression'); };特性:
- 提升(Hoisting):函数表达式不会被提升,只有在函数表达式定义之后才能调用它。
- 语法:函数表达式是一个匿名函数(没有名称)或具名函数赋值给变量。
- 名称:可以是匿名函数或具名函数。匿名函数没有名字,而具名函数有名字。
示例:
javascript// 错误:调用函数表达式之前不能使用 console.log(myFunction()); // TypeError: myFunction is not a function const myFunction = function() { return 'Function Expression'; }; console.log(myFunction()); // 输出: 'Function Expression'
3. 具名函数表达式
具名函数表达式是函数表达式的一种形式,其中函数有一个名字。
定义方式:
javascriptconst myFunction = function namedFunction() { console.log('Named Function Expression'); };特性:
- 名称:函数有一个名字(
namedFunction),该名称仅在函数内部可用,用于递归调用或调试。 - 提升:函数的名称不会被提升,但函数表达式本身的提升规则与普通函数表达式相同。
- 名称:函数有一个名字(
示例:
javascriptconst myFunction = function namedFunction() { return 'Named Function Expression'; }; console.log(myFunction()); // 输出: 'Named Function Expression'
题目要点:
函数声明:
- 通过关键字
function定义。 - 会被提升到作用域顶部,允许在声明之前调用。
- 必须有一个函数名称。
- 通过关键字
函数表达式:
- 通过将一个函数赋值给一个变量来定义。
- 不会被提升,只有在定义之后才能调用。
- 可以是匿名函数或具名函数。
选择使用函数声明还是函数表达式取决于具体需求。函数声明适用于需要在作用域内的任何位置都能访问的情况,而函数表达式适用于需要在定义之后才使用的情况,或者用于回调、事件处理程序等场景。