在for循环之前声明 i,会打印出5个5
let i = 0;
for (i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i);
})
}
控制台结果:
![](/image/aHR0cHM6Ly9pbWctYmxvZy5jc2RuaW1nLmNuLzIwMjEwODI0MjE1MDE5OTEzLnBuZw%3D%3D)
以上写法for循环的时候,setTimeout会延迟立即打印
打个比方,老板让你数一下仓库的莫类商品,然后马上告知他,你会在数完之后告知他一个总数100.而不是告知他1,2,3......100
setTimeout是异步执行,只有主线上的全部执行完,才会执行任务队列里的任务,当主线执行完后,i是6,所以此时再去执行任务队列里的任务时,i全部是6了。
2.在for循环中声明 i,会打印出0,1,2,3,4
for (let i = 0; i < 5; i++) {
setTimeout(()=>{
console.log(i);
})
}
控制台结果:
![](/image/aHR0cHM6Ly9pbWctYmxvZy5jc2RuaW1nLmNuLzIwMjEwODI0MjIwNDE0MjQzLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3dhdGVybWFyayx0eXBlX1ptRnVaM3BvWlc1bmFHVnBkR2ssc2hhZG93XzEwLHRleHRfYUhSMGNITTZMeTlpYkc5bkxtTnpaRzR1Ym1WMEwyMHdYelE0TXpjNU1USTIsc2l6ZV8xNixjb2xvcl9GRkZGRkYsdF83MA%3D%3D)
每一次for循环的时候,setTimeout搜执行一次,但是里面的函数没有被执行,而是被放到了任务队列里面,等待执行,for循环了6次,就放了6次,当主线程执行完成后才进入任务队列里面执行。
因为for循环头部的let不仅将 i 绑定到for循环换中,事实上他将其重新绑定到循环体的每一次迭代中,确保上一次迭代结束的值重新被赋值。