我最近开始维护别人的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