JS 函数声明和函数表达式的区别

函数声明和函数表达式的区别

函数声明即:

function sayHello() {
  console.log("Hello,World.");
}

函数表达式即:

const sayHello = function () {
  console.log("Hello,World.");
};

两者几乎没有什么区别,但是有一些地方还是需要注意:

  • 函数声明和变量声明类似,会被提升至作用域的顶部,所以可以在声明之前使用。

    sayHello(); // 输出 Hello,World.
    function sayHello() {
      console.log("Hello,World.");
    }
    

    而函数表达式不可以

    sayHello(); // 会报错, Uncaught ReferenceError: can't access lexical declaration 'sayHello' before initialization
    const sayHello = function () {
      console.log("Hello,World.");
    };
    
  • 两者的形式不太一样

    函数声明的代码末尾没有分号,而函数表达式的代码末尾有分号,这是为什么?

    因为函数声明是一个代码块,和 if {}​​ 或 for {}​​ 类似,所以不需要。

    而函数表达式属于一个语句,就上面的例子而言,它属于 const SayHello = ...​​ 的一部分,所以在语句的末尾需要添加一个分号。

应该使用哪种方式?

在大多数情况下优先使用函数声明,因为声明会被提升(host),可以更方便的组织代码,更有灵活性,而且在搜索代码时 function sayHello() 明显要比 const sayHello = function () 更容易检索。

在一些函数声明无法满足需要的情况下,再考虑使用函数表达式的方式。