JS 函数的执行时机

89 阅读1分钟

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

let i = 0
for(i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}//输出:6个6
  1. let 声明一个变量i,并赋值为1
  2. 执行for语句,但因为setTimeout会加入宏队列,所以会在for语句执行结束后执行
  3. 变量i只有一个,且最终赋值为6,所以最后执行setTimeout打印出6个6

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

for(let i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}//0、1、2、3、4、5

ES6 为了解决上述问题,当for与let结合使用时,每次for循环就会在隐藏作用域内重新声明一个i ,那样的话,6 次循环,就会有 6 个不同的 i,console.log 出来的 i ,i的值遵循就近原则,当然是新声明的i。

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

for (var i = 0; i < 5; i++) { 
  (function(i){   //立刻执行函数
    setTimeout(function (){
      console.log(i); 
     },0); 
  })(i); 
}