JS 函数的执行时机

121 阅读1分钟

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

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

setTimeout()的意思是,结束了当前任务后马上执行,在上文代码中的意思就是,在结束for循环后立刻执行。在遍历i时,setTimeout()其实执行了6次,但因为是“马上执行”,所以不会立刻打印出i,而是在程序i遍历结束后,才会执行console.log(i),遍历结束后,i已经变成了6,所以结果是6个6。

要是想打出0—5呢?

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

这里 let 会单独创建一个作用域 相当于有6个i,因为i等6时,6不小于6,所以for循环没有执行,最终打印出0, 1,2,3,4,5。