拥有以下for循环:
for (var i = 0; i < 3; ++i) {
console.log(i, p);
var p;
p = 42;
}
我期待输出为:
0 undefined
0 undefined
0 undefined
但实际上,输出是:
0 undefined
0 42
0 42
由于我们正在使用var p
(重新声明p
)下一行,为什么p
行未定义{始终} console.log
?
答案 0 :(得分:6)
由于variable hoisting而你的变量是函数作用域而不是块作用域。
你的for循环被翻译为
var p;
for (var i = 0; i < 3; ++i) {
console.log(i, p);
p = 42;
}
这意味着第一次访问p是undefined
,
下次它已在当前函数范围内初始化,因此它将保持初始值。