JS 函数的执行时机

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

如上javascript代码,执行的结果是6个6,为什么会是这样呢?

javascript是一门单线程的语言,每一次调用setTimeout这个函数,传递过来的回调函数并不会在主线程上立即执行,而是会放到事件循环队列中,等待主线程都执行完,当for循环执行完之后(此时i为6),主线程上执行完毕,才会执行回调函数,因此打印出6个6。

  • 如何让代码打印出0,1,2,3,4,5呢 阮一峰es6中有相类是的问题(let的例子) es6.ruanyifeng.com/#docs/let, 使用let可以很好的解决这个问题,在每一次执行for循环的时候,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量。
for(let i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}

另外一种是使用立即执行函数,将参数传递进去

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