我正在学习 JavaScript,我觉得我对提升的理解足够体面,所以我不会问它是什么或如何做或类似的事情。
吊起来好吗?如果可以的话,我应该使用声明我的变量吗
var foo = function() {};
还是我应该改用这个?
function foo() {}
我什么时候应该起吊,什么时候不应该起吊?还是根本不重要?
我正在学习 JavaScript,我觉得我对提升的理解足够体面,所以我不会问它是什么或如何做或类似的事情。
吊起来好吗?如果可以的话,我应该使用声明我的变量吗
var foo = function() {};
还是我应该改用这个?
function foo() {}
我什么时候应该起吊,什么时候不应该起吊?还是根本不重要?
提升不是你能做或不能做的事情,它只是发生在 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/
这个问题没有客观的答案。这取决于个人喜好。
在我自己的代码中,我更喜欢var foo = function() {};
. 恕我直言,避免函数提升使代码更容易理解,因为源代码顺序很重要。
更新: ES6/ES2015 规范对特定情况有相同的建议:
在 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 尽可能避免函数提升。
在函数顶部声明所有变量是一个很好的做法,因为提升....(不在 ES6 中)。
var foo = function() {};
和function foo() {}
是两个不同的东西。第一个创建一个变量并传递一个匿名函数,第二个是“只是”一个函数。
你不能说,什么肯定是更好的。这取决于上下文。