Skip to content

函数声明与函数表达式有什么区别

参考答案:

函数声明(Function Declaration)和函数表达式(Function Expression)是两种定义函数的方式,在 JavaScript 中有一些重要的区别。以下是它们的主要区别和特点:

1. 函数声明(Function Declaration)

  • 定义方式

    javascript
    function myFunction() {
        console.log('Function Declaration');
    }
  • 特性

    • 提升(Hoisting):函数声明会被提升到其所在作用域的顶部。这意味着你可以在函数声明之前调用它。
    • 语法:具有关键字 function 开头,后跟函数名、参数列表和函数体。
    • 名称:函数声明需要一个名字。
  • 示例

    javascript
    console.log(myFunction()); // 输出: 'Function Declaration'
    
    function myFunction() {
        return 'Function Declaration';
    }

2. 函数表达式(Function Expression)

  • 定义方式

    javascript
    const 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. 具名函数表达式

具名函数表达式是函数表达式的一种形式,其中函数有一个名字。

  • 定义方式

    javascript
    const myFunction = function namedFunction() {
        console.log('Named Function Expression');
    };
  • 特性

    • 名称:函数有一个名字(namedFunction),该名称仅在函数内部可用,用于递归调用或调试。
    • 提升:函数的名称不会被提升,但函数表达式本身的提升规则与普通函数表达式相同。
  • 示例

    javascript
    const myFunction = function namedFunction() {
        return 'Named Function Expression';
    };
    
    console.log(myFunction()); // 输出: 'Named Function Expression'

题目要点:

  • 函数声明

    • 通过关键字 function 定义。
    • 会被提升到作用域顶部,允许在声明之前调用。
    • 必须有一个函数名称。
  • 函数表达式

    • 通过将一个函数赋值给一个变量来定义。
    • 不会被提升,只有在定义之后才能调用。
    • 可以是匿名函数或具名函数。

选择使用函数声明还是函数表达式取决于具体需求。函数声明适用于需要在作用域内的任何位置都能访问的情况,而函数表达式适用于需要在定义之后才使用的情况,或者用于回调、事件处理程序等场景。