JS 函数的执行时机

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

这段代码会打印出6个6而非0,1,2,3,4,5,这可能会让人感到疑惑。setTimeout()中的代码会在当前代码执行完后再运行,在这个例子中,for会先完成从0到6的自增,当完成自增之后,由于只有一个变量i,因此循环体中setTimeout()中的console.log(i)会打印出6个6

如何打印出0,1,2,3,4,5?

  • 使用先进的let,此处不要将let写在for循环体外,因为只有如下这么写时,JS会做特殊操作,每次循环新建一个变量i
for(let i = 0; i<6; i++){ setTimeout(()=>{ console.log(i) },0) }
  • 将setTimeout抽离以让它立刻执行
for(let i = 0; i<6; i++){ fn(i); }

function fn(i){
setTimeout(()=>{ console.log(i) },0);
}

试试在浏览器中运行吧