let i
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
以上代码为什么会打印出6个6,而不是0,1,2,3,4,5呢?我的理解是这样的:
- 首先声明了一个全局变量
i - 随着
for循环的执行i的值不断改变,当for循环结束时i = 6 - 而
setTimeOut()函数的作用是尽快执行,也就是for循环结束时执行 - (通俗理解就是在循环过程中设置了6个闹钟,循环结束之后这6个闹钟依次响起,运行结果都是打印出6)
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
将i声明为一个局部变量就解决这个问题了:
- 每次循环都会创建一个新的局部变量
i - 每次执行
setTimeOut()都只能拿到本次的i
还可以使用立即执行函数
for (i = 0;i < 6; i++){
!function (i) {
setTimeout(() => {
console.log(i)
},0)
}(i)
}