JS 函数的执行时机

117 阅读1分钟

如下代码为什么会打印6个6

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

setTimeout()的毫秒数设置为0,先执行函数调用栈中的代码,再调用定时器。 定时器被放在一个队列中,等待上下文的可执行代码运行完毕后,才开始运行定时器。 代码中先执行for循环,再执行定时器方法时,变量已经全部变成了6,所以输出全部都是6

让上面的代码打印0、1、2、3、4、5的方法

  1. 利用ES6
for(let i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i) 
  },0)
}
  1. 利用setTimeout的第三个参数
for (var i=0; i<6; ++i) {
	setTimeout(function(i){
		console.log(i)
	}, 0, i)
 }
  1. 利用闭包
for(var i=0; i<6; ++i) {
   !(function(j) {
   	setTimeout(function(){
   		console.log(j)
   	}, 0)
   })(i)
}