1

可能重复:
重新声明 JavaScript 变量

我有下一段代码:

var i = 11;
alert(i);
function a(){
    alert(i);
    var i = 2;
    alert(i);
}
a()

第二个alert(i)(在函数内部)产生undefined. 我猜这与 JS 引擎运行代码的方式有关 - 也许它在遍历代码之前没有先存储变量?

无论如何我认为这不是问题是JS,因为它支持提升。我可能弄错了 - 有人愿意解释吗?

谢谢!

4

1 回答 1

4

JavaScript 确实将声明提升到它们发生的范围的顶部,但是分配发生在您期望它们发生的地方。您的代码被有效地解析如下:

/* Function declarations are hoisted first, which is why you can invoke a
   function before it appears to be defined in the source */
function a() {
    var i; // Declaration is hoisted (this i shadows the outer i)
    alert(i);
    i = 2; // Assignment to local i happens in place
    alert(i);
}
var i; // Declaration is hoisted (at this point, i === undefined)
i = 11; // Assignment happens in place
alert(i);
a();

在规范中有详细说明。进入新的执行上下文后,会发生以下情况:

对于代码中的每个VariableDeclarationVariableDeclarationNoIn d,按源文本顺序执行

  • dnd中的标识符
  • varAlreadyDeclared成为调用env 的HasBinding 具体方法并传递dn作为参数的结果。
  • 如果varAlreadyDeclaredfalse,那么
    • 调用env 的CreateMutableBinding 具体方法,传递dnconfigureBindings作为参数。
    • 调用env 的SetMutableBinding 具体方法,传递dnundefinedstrict作为参数。
于 2012-12-04T09:06:54.703 回答