JS 函数的执行时机

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

以上代码,会打印出6个6,什么原因呢? 这里的i声明在for循环外部,执行完同步任务for循环后,JS引擎开始执行异步任务循环出来的6个setTimeout函数。此时环境里只有一个全局变量i = 6(根据for循环执行顺序,在i=6时跳出for循环),所以6个setTimeout函数都打印了6。


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

这里的代码,就会打印出0,1,2,3,4,5,当for循环中,在小括号中用let声明循环变量,JS引擎会在每一次循环体里单独用let声明一次当时的循环变量,所以每一个setTimeout所在的block(块)里,都有一个let声明的局部变量i,因此打印出0,1,2,3,4,5。可以理解为

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

也可以用立即执行函数实现,

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