在循环中重新定义变量不会使其未定义

Nuv*_*nnu 0 javascript loops for-loop redeclaration

具有以下for循环:

for (var i = 0; i < 3; ++i) {
    console.log(i, p);
    var p;
    p = 42;
}
Run Code Online (Sandbox Code Playgroud)

我期待输出为:

0 undefined
0 undefined
0 undefined
Run Code Online (Sandbox Code Playgroud)

但实际上,输出是:

0 undefined
0 42
0 42
Run Code Online (Sandbox Code Playgroud)

由于我们正在使用var p(重新声明p)下一行,为什么行中没有p未定义(总是)console.log

gur*_*372 6

由于变量提升而你的变量是函数作用域而不是块作用域.

你的for循环被翻译成

var p;
for (var i = 0; i < 3; ++i) {
    console.log(i, p);
    p = 42;
}
Run Code Online (Sandbox Code Playgroud)

这意味着第一次访问p是undefined,

下次它已在当前函数范围内初始化,因此它将保持初始化值.