JS 函数的执行时机

83 阅读1分钟

请大家观看下面代码

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