for语句与异步执行之间的关系

106 阅读1分钟

首先看一段代码

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 声明的变量是语句的局部变量。