首先看一段代码
for (var i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i);
}, 1000);
}
与另一段代码
for (let i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i);
}, 1000);
}
只有一个var与let的区别去定义变量i,但输出的结果是完全不同的。
第一段代码输出是
5
5
5
5
5
第二段代码输出是
0
1
2
3
4
setTimeout是异步执行的,也就是说for语句先执行完之后,事件队列中其实是多了5个回调函数,等待1秒的时间后去输出i的值。但由于使用 var 声明的变量不是该循环的局部变量,而是与 for 循环处在同样的作用域中。用 let 声明的变量是语句的局部变量。