我有下一段代码:
var i = 11;
alert(i);
function a(){
alert(i);
var i = 2;
alert(i);
}
a()
第二个alert(i)
(在函数内部)产生undefined
。我猜测它与JS引擎运行代码的方式有关 - 也许它不会先存储变量,然后再进行操作?
无论如何我认为这不是问题,因为JS支持吊装。我可能错了 - 有人在乎解释吗?
谢谢!
答案 0 :(得分: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();
详细in the spec。输入新的执行上下文后,会发生以下情况:
对于代码中的每个 VariableDeclaration 和 VariableDeclarationNoIn d ,在源文本顺序中执行
- 让 dn 成为 d 中的标识符。
- 让 varAlreadyDeclared 成为调用 env的 HasBinding具体方法传递 dn 作为参数的结果。
- 如果 varAlreadyDeclared 是
false
,那么
- 调用 env的 CreateMutableBinding具体方法,将 dn 和 configurableBindings 作为参数传递。
- 调用 env的 SetMutableBinding具体方法,将 dn ,
undefined
和 strict 作为参数传递。