var vs let for for循环javascript

时间:2017-03-20 15:40:49

标签: javascript ecmascript-6

我知道我们的范围是最近的封闭区块。但仍然不明白为什么下面给出的代码输出如此不同。

for (let i = 0; i < 5; i++) {
  setTimeout(function() {
    console.log(i)
  }, 1000)
}

// 0,1,2,3,4

for (var i = 0; i < 5; i++) {
  setTimeout(function() {
    console.log(i)
  }, 1000)
}

// 5,5,5,5,5

1 个答案:

答案 0 :(得分:4)

第二个输出是这样的,因为timeout实际运行的时间,i被设置为最后一次迭代。为什么?因为如果您在var中使用for,则变量会在循环范围之外悬挂,因此它实际上看起来像:

var i = 0;
for (i=0;i<5;i++){
    //and when your timeout runs, i is 5
}
console.log(i); //5

let并没有在外面提升:

for (let i=0;i<5;i++){

}
console.log(i); //undefined, not hoisted