请大家观看下面代码
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
这串代码运行出来是这样的情况
- 是不是很疑惑为啥控制台会打印出6个6
- 因为setTimeout这个函数会让你的console.log()慢一点执行
- 会让你把for循环做完后马上答应出 i
- 就比如你每天早上去上班怕迟到,定了闹钟,然后闹钟会依次响起,可能会慢一点但是一定会响起,所以for循环执行时,里面没进行打印,等for执行完后里面开始打印,所以打印了6次6
但是你还是想的是打印1到5对吧,好的下面一个方法或许可以救你
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
这就可以得到1~5了,你会说没啥变化啊!请注意我把let i定义到外面转到for循环里面了
这其中改变的原因是:
因为js在for循环和let一起用时会加东西,每次运行会把 i 复制一次加入到这个空间里加上本来的i ,所以会产生 1~5,这个操作类似于刻舟求剑,看刻标记,然后到了下去捞,搞笑的是剑找到了,这就非常的搞笑
每次循环都会创造一次 i