JS函数的执行时机

99 阅读1分钟

6个6问题

let i = 0
for(i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}
//结果输出6个6
复制代码

for循环在主线程内,setTimeout是异步方法,在任务队列里面,只有主线程执行完后,任务队列才执行,当for执行结束时候,此时的i值已经是6,所以得到结果是个6。

那么如何输出0-5呢。

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

这是JS后来为新人开发者改变的一个东西。让代码按着新人的思路来实现。

出了上面这种方法能够实现打印0-5 那么还有其他方法吗?

  1. 可以通过自执行函数来实现
  for (var i = 0; i <= 5; i++) {
      !(function (j) {
        setTimeout(function print() {
          console.log(j);
        }, 0);
      })(i);
    }
复制代码
  1. 通过setTimeout第三个参数
for (var i = 0; i < 6; i++) {
      setTimeout((i) => console.log(i), 0, i);
    }