我最近开始维护别人的JavaScript代码。我正在修复错误,添加功能,还试图整理代码并使其更加一致。

以前的开发人员使用了两种方法来声明函数,如果有背后的原因,我将无法解决。

两种方式是:

var functionOne = function() {
    // Some code
};
function functionTwo() {
    // Some code
}

使用这两种不同方法的原因是什么,每种方法的利弊是什么?有什么方法可以用另一种方法不能完成的?

最佳答案

区别在于functionOne是一个函数表达式,因此仅在到达该行时才定义,而functionTwo是一个函数声明,并在其周围的函数或脚本执行后就定义(由于hoisting)。

例如,一个函数表达式:

// TypeError: functionOne is not a function
functionOne();

var functionOne = function() {
  console.log("Hello!");
};


并且,一个函数声明:

// Outputs: "Hello!"
functionTwo();

function functionTwo() {
  console.log("Hello!");
}


从历史上看,块内定义的函数声明是在浏览器之间不一致地处理的。严格模式(在ES5中引入)通过将函数声明的作用域限定在其封闭块中来解决。

'use strict';
{ // note this block!
  function functionThree() {
    console.log("Hello!");
  }
}
functionThree(); // ReferenceError

10-08 08:33