《JS 函数的执行时机》

67 阅读1分钟

打印出6个6代码分析

let i = 0
for(i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}

image.png

代码打印6个6是主要是因为setTimeout的存在,setTimeout的作用是延迟后执行,所以就有了以上代码打印出6个6的情况。

JS引擎是单线程执行,先执行同步,再执行异步,所以即使setTimeout等待时间为零,依然要等待主程序执行完毕后,才会开始执行,但此时i的值已经是6了,所以就有了以上情况

打印出0,1,2,3,4,5代码如下

for(let i =0;i<6;i++)
    setTimeout(()=>{
        console.log(i)
    },0)

for let循环更多的是为了照顾JS新人的想法给出的办法,上面代码中,变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以输出结果为i<6前的所有值。

既然setTimeout是延迟执行,是不是可以推断出如果引用立即执行函数,也能够让该代码打印出0~5

let i = 0 
for(i = 0; i<6; i++){ 
    !function(i){ 
      setTimeout(()=>{ console.log(i) 
    },0) 
  }(i) 
}