Javascript 两个相似的for循环输出不同的值

Javascript 两个相似的for循环输出不同的值,javascript,Javascript,我无法计算以下两个循环的输出。我注意到的唯一区别是前者使用var并分配一个全局范围,而后使用const创建一个局部范围 for (var i = 0; i < 3; i++) { setTimeout(() => console.log(i), 1); } for (let i = 0; i < 3; i++) { setTimeout(() => console.log(i), 1); } 首先console.log(i)在控制台中打印的输出是0 1 2。而

我无法计算以下两个循环的输出。我注意到的唯一区别是前者使用
var
并分配一个全局范围,而后使用
const
创建一个局部范围

for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 1);
}

for (let i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 1);
}
首先
console.log(i)
在控制台中打印的输出是
0 1 2
。而在
setTimeout
中包装的一个中,则会发生变化


为什么?

var
被提升到全局范围,因此当调用
setTimeout
时,无论调用
i
的值是什么,它都会注销,这将是
3
,因为for循环在其最后一次迭代中将
i
设置为
3
。而
let
的作用域是
for
循环,并在每次迭代中关闭
i
的值,因此打印
0 1 2

for (var i = 0; i < 3; i++) {
  console.log(i);
  setTimeout(() => console.log(i), 1);
}