我知道我们的范围是最近的封闭区块。但仍然不明白为什么下面给出的代码输出如此不同。
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
答案 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