5

我正在学习 JavaScript,我觉得我对提升的理解足够体面,所以我不会问它是什么或如何做或类似的事情。

吊起来好吗?如果可以的话,我应该使用声明我的变量吗

var foo = function() {};

还是我应该改用这个?

function foo() {}

我什么时候应该起吊,什么时候不应该起吊?还是根本不重要?

4

3 回答 3

6

提升不是你能做或不能做的事情,它只是发生在 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/

于 2015-04-21T09:19:50.593 回答
3

这个问题没有客观的答案。这取决于个人喜好。

在我自己的代码中,我更喜欢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 尽可能避免函数提升。

于 2015-04-21T09:20:50.663 回答
0

在函数顶部声明所有变量是一个很好的做法,因为提升....(不在 ES6 中)。

var foo = function() {};function foo() {}是两个不同的东西。第一个创建一个变量并传递一个匿名函数,第二个是“只是”一个函数。

你不能说,什么肯定是更好的。这取决于上下文。

于 2015-04-21T09:20:46.007 回答