JS 函数的执行时机

93 阅读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,1,2,3,4,5?

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

(JS为了迎合大众的自然理解,有一个新的规则,猜的)如果没有在外面声明 i,那么此时每次执行for循环时,会在循环里生成一个i,保存下来。循环里会生成6个新的i,加上起始的一个i,也就是0,因为i等6时,6不小于6,所以for循环没有执行,最终打印出0, 1,2,3,4,5。(其实此时setTimeout已经没什么意义了)l