JS函数的执行时机

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

以上代码为什么会打印出6个6,而不是0,1,2,3,4,5呢?我的理解是这样的:

  • 首先声明了一个全局变量i
  • 随着for循环的执行i的值不断改变,当for循环结束时i = 6
  • setTimeOut()函数的作用是尽快执行,也就是for循环结束时执行
  • (通俗理解就是在循环过程中设置了6个闹钟,循环结束之后这6个闹钟依次响起,运行结果都是打印出6)

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

i声明为一个局部变量就解决这个问题了:

  • 每次循环都会创建一个新的局部变量i
  • 每次执行setTimeOut()都只能拿到本次的i

还可以使用立即执行函数

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