JS 函数的执行时机

128 阅读1分钟

对于以下函数,执行后,会打印出6,6,6,6,6,6

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

setTimeout函数会设置一个定时器,该定时器在定时器到期后执行一个函数或指定的一段代码。对于上面的代码,setTimeout会让console.log(i)在for循环结束后执行,当for循环结束时,i的值为6,因此会打印出6,6,6,6,6,6

如果期待得到0,1,2,3,4,5的结果,可以用以下代码实现:

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

for循环的()中,用let声明变量时,每次执行循环体,都会单独设置一个i。

此外,还可以用以下代码实现:

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

这段代码内加入了一个立即执行函数,让循环体中的代码执行后再进入下一次循环