给出以下代码,输出的结果是什么?原因?
for(var i=0;i<5;i++) {
setTimeout(function(){
console.log(i);
},1000);
}
console.log(i)
举一个更完善的例子:
console.log(i) // 打印顺序:① 打印值:undefined for (var i = 0; i < 3; i++) { console.log(i); // ② 0,1,2 setTimeout(() => console.log(i), 0); // ⑥ 3,3,3 } console.log(i) // ③ 3 for (let i = 0; i < 3; i++) { console.log(i); // ④ 0,1,2 setTimeout(() => console.log(i), 0); // ⑦ 0,1,2 } console.log(i) // ⑤ 3
⑥ var定义的变量属于全局变量。每次for循环,只是将定时器的回调函数加入队列,但并没有执行,且通过var定义的全局变量i无法跟随每次循环产生的回调函数一起进入队列。因此,在1ms后,执行产生的三个回调,输出的i均是来自全局作用域中的i,1ms三次for循环完全可以执行完毕,此时全局变量i也就变成了3,自然就会输出3次3。
⑦ let定义的是块级作用域,每次循环,块级作用域的变量i可以跟随定时器的回调一起进入队列,既然自己带着i,那每次只要输出自己带的i对应的值即可。