可能重复:
重新声明 JavaScript 变量
我有下一段代码:
var i = 11;
alert(i);
function a(){
alert(i);
var i = 2;
alert(i);
}
a()
第二个alert(i)
(在函数内部)产生undefined
. 我猜这与 JS 引擎运行代码的方式有关 - 也许它在遍历代码之前没有先存储变量?
无论如何我认为这不是问题是JS,因为它支持提升。我可能弄错了 - 有人愿意解释吗?
谢谢!
可能重复:
重新声明 JavaScript 变量
我有下一段代码:
var i = 11;
alert(i);
function a(){
alert(i);
var i = 2;
alert(i);
}
a()
第二个alert(i)
(在函数内部)产生undefined
. 我猜这与 JS 引擎运行代码的方式有关 - 也许它在遍历代码之前没有先存储变量?
无论如何我认为这不是问题是JS,因为它支持提升。我可能弄错了 - 有人愿意解释吗?
谢谢!
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();
这在规范中有详细说明。进入新的执行上下文后,会发生以下情况:
对于代码中的每个VariableDeclaration和VariableDeclarationNoIn d,按源文本顺序执行
- 令dn为d中的标识符。
- 让varAlreadyDeclared成为调用env 的HasBinding 具体方法并传递dn作为参数的结果。
- 如果varAlreadyDeclared是
false
,那么
- 调用env 的CreateMutableBinding 具体方法,传递dn和configureBindings作为参数。
- 调用env 的SetMutableBinding 具体方法,传递dn、
undefined
和strict作为参数。