JS 函数的执行时机

185 阅读1分钟
let i = 0
for(i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}

setTimeout函数的意思是,先执行完手头的事情(这里的for循环),在执行setTimeout函数内的内容,它就相当于在当前处开启了一个定时器,因此,这里要等到for循环结束之后才会执行setTimeout语句中的console.log(i)命令,而这时候i的值为6,总共开启了6个“计时器”,因此分别执行6次console.log(i)命令,输出6个6

而如果执行如下命令:

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

则会输出0,1,2,3,4,5,6.因为JS在for和let一起用的时候会加东西,每次循环会创建一个i

其他解决办法:

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