var 与 let in for 循环 javascript

Car*_*los -1 javascript ecmascript-6

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

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

//0,1,2,3,4

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

//5,5,5,5,5

tym*_*eJV 5

第二个输出如此,因为您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
Run Code Online (Sandbox Code Playgroud)

并且let不会在外面起吊:

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

}
console.log(i); //undefined, not hoisted
Run Code Online (Sandbox Code Playgroud)

  • `i` 的最终值是 5,而不是 4。最终表达式 (`i++`) 在循环迭代结束时进行评估,在条件的下一次评估 (`i&lt;5`) 之前。 (3认同)