JavaScript的函数执行时机

150 阅读1分钟

下面代码为何会打印出6个6

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

JavaScript是一个单线程的解释器,所以在一段时间内只能执行一段代码,但是setTimeout过一段时间执行里面的代码,也就是等到其他非延迟语句执行完了,才能够轮到setTimeout执行。上面的代码中,即使setTimeout设置的时间为0,也要等待一段时间,执行完了for语句的循环,也就是最后一次i=6时候,不符合循环的条件判断,setTimeout的里面输出语句就被执行6次,也就输出了6个6。

如何使得上面代码打印出0、1、2、3、4、5的方法

当然,为了更好理解js的 setTimeout,稍加改变,用下面方法就可以输出0-5。

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

除了使用 for let 配合,还有什么其他方法可以打印出 0、1、2、3、4、5.

因为setTimeout是等待一段时间,当非延迟代码执行完了,就执行setTimeout,只要将for循环放入setTimeout中,外面没有非延迟代码,就只能执行里面的代码了。此时输出的就是0到5了。

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