JS 函数的执行时机

211 阅读1分钟

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

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

主要因为setTimeout是异步任务,会在同步任务执行完成后才会执行异步任务。此时i已经变成了6。

如何打印0-5?

将异步任务改成同步任务即可打印0-5,但这完全改变了代码的功能,不可取。

  1. for 和 let 搭配使用(i的声明在for的初始语句中),让每次循环都有独自的i,那么即使setTimeout是异步的,也只是读取到独自的i,所以可以打印0-5.
for(let i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}
  1. 根据第一个解决方案的思路,解决该问题就是需要有一个局部变量。那么可以使用匿名函数保存局部变量。
for(let i = 0; i<6; i++){
    !function(i){
        setTimeout(()=>{
            console.log(i)
          },0)
    }(i)
}