我正在学习JavaScript,我觉得我理解提升得体面,所以我不会问它是什么,怎么做或类似。
升降机好吗?如果可以,我应该使用
声明我的变量var foo = function() {};
或者我应该使用它吗?
function foo() {}
什么时候应该提升,什么时候不应该?或者它甚至是否重要?
答案 0 :(得分:5)
吊装不是你可以做或不做的事情,它只是在JavaScript中发生。
提升是指所有变量声明都“移动”到包含范围的顶部。
您所说的是使用函数表达式与函数声明。两种风格都很好,只要记住它们在悬挂的东西上有一点不同:
var foo = function() {} // foo gets hoisted, but not the function itself
function foo(){} // the variable and the function get hoisted
有关详细信息,请查看我撰写的有关使用JavaScript提升的文章:http://www.kenneth-truyers.net/2013/04/20/javascript-hoisting-explained/
答案 1 :(得分:3)
这个问题没有客观的答案。这取决于个人偏好。
在我自己的代码中,我更喜欢var foo = function() {};
。恕我直言,避免函数提升使代码更容易理解,因为源代码顺序很重要。
更新:针对特定情况的ES6 / ES2015规范has the same recommendation:
在ECMAScript 2015之前,ECMAScript规范没有将FunctionDeclaration的出现定义为Block语句的StatementList的元素。但是,对这种形式的FunctionDeclaration的支持是一个允许的扩展,大多数浏览器托管的ECMAScript实现允许它们。不幸的是,这些声明的语义在这些实现中是不同的。由于存在这些语义差异,使用块级函数声明的现有Web ECMAScript代码只能在浏览器实现中移植,如果用法仅取决于此类声明的所有浏览器实现的语义交集。
例如,以下代码的行为在ES5中未定义,并且在浏览器/引擎/实现之间有所不同:
if (true) {
function foo() { return 1; }
} else {
function foo() { return 2; }
}
console.log(foo()); // `1` or `2`?
但是,以下代码具有完全明确且可互操作的行为:
var foo;
if (true) {
foo = function() { return 1; }
} else {
foo = function() { return 2; }
}
console.log(foo()); // `1`
TL; DR尽可能避免功能提升。
答案 2 :(得分:0)
这是一个很好的做法,在函数顶部声明所有变量,因为提升....(不在ES6中)。
var foo = function() {};
和function foo() {}
是两回事。第一个创建一个变量并传递一个匿名函数,第二个是'只是'一个功能。
你不能说,绝对是更好的。它取决于上下文。