JS 函数的执行时机

91 阅读1分钟

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

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

执行原理

  • 先赋值i的值为0

  • 然后判断是否 i<6 ? 如果满足条件会继续进入下一个循环。

  • 这时本来要执行setTimeout(),但由于setTimeout()的性质,需要等一会才执行。

  • 执行i++,此时i赋值为1.

  • 继续判断i<6,满足进入第二个循环,第三次循环....

  • 直到i的值是6时,不满足i<6.

  • 停止循环

  • 这时,前面的六次循环中的setTimeout() 开始执行,并打印出现在的i。

原因

使用 setTimeout的意思就是说尽快执行 ,尽快执行完当前代码后执行
那么这里就是在 for 循环之后打印出 i,所以也就是 6 个 6。

让上面代码打印 0、1、2、3、4、5 的方法

把变量的声明写在循环里就可以打印出0、1、2、3、4、5

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

还有什么其他方法可以打印出 0、1、2、3、4、5

可以使用setTimeout的第三个参数

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