let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
段代码执行完之后会打印6个6是因为定时器不是同步,他会自动的进入任务队列,等待同步任务的执行完毕才会执行。所以同步代码执行完的时候,i在for循环里i++到5停止执行,所以i此时变成了5,这时候循环已经结束,定时器里的打印也会打印出6个6。
可以使用let,let具有块级作用域,每一次循环都会重新声明变量i,随后每一个循环都会使用上一个循环时结束的值来初始化这个变量i,每次执行也都是一个全新的独立的作用域。
还可以使用立即调用函数,每次执行循环时都会声明一个局部变量,变量不会被污染。
for (var i = 0; i < 6; i++) {
!function (i) {
setTimeout(() => {
console.log(i)
}, 0)
}(i)
}
