《JS 函数的执行时机》

113 阅读1分钟

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

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

首先介绍一下setTimeout:JS内置了一个setTimeout函数,用途是指定某个函数或者某段代码在多少毫秒之后执行。 for循环:语法:for(语句1;表达式2;语句3){循环体},for循环会执行完才能进入下一步。 当for循环时:

  1. 先赋值i的值为0
  2. 然后判断是否 i<6 ? 如果满足条件会继续进入下一个循环。
  3. 这时本来要执行setTimeout(),但由于setTimeout()的性质,需要等一会才执行。
  4. 执行i++,此时i赋值为1.
  5. 继续判断i<6,满足进入第二个循环.
  6. ……
  7. 直到i的值是6时,不满足i<6.
  8. 停止循环
  9. 这时,前面的六次循环中的setTimeout() 开始执行,并打印出现在的i。

由于该循坏中,setTimeout()执行了六次并是在最后执行的,而最后的i为6。因此,会打印出 6 个 6。 二、如果把let i = 0放在for里面,挪动下位置。

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

此时的输出的结果则为0,1,2,3,4,5 这是因为变量i放在了for循环参数列表中声明,这样做每次循环都会多创建一个i的副本,用来保存当前循环的i值,最后执行console.log(i)时,打印的不是i,而是前面i在不同阶段创建的副本。