JS函数的执行时机

129 阅读1分钟

以一个 for 循环的例子来解释JS函数的执行时机

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

代码在执行时,声明了一个变量 i,然后执行 for 循环,for 循环在主线程中执行。循环体中的 setTimeout 是一个异步方法,会放到任务队列中,只有当主线程的代码执行完毕后,才会执行任务队列中的方法。当 for 循环执行结束后,此时 i 为 6,所以得到的结果是 六个六

那么如何改写上面的代码,将其打印出0、1、2、3、4、5呢

在 for 循环内使用 let 声明 i

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

通过 var 和 JS 技巧来实现和上面代码的相同功能

通过 setTimeout 的第三个参数来传递每层循环中的 i

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

通过 JS 的立即执行函数(Immediately Invoked Function Expression)来实现

for (var i = 0; i < 6; i++) {
  !(function (currentValue) {
    setTimeout(() => {
      console.log(currentValue)
    }, 0)
  })(i)
}

利用 const 声明的变量不可更改的特性

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