JS 函数的执行时机

33 阅读1分钟

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

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

由于此循环的执行时机,是在过一会之后,i的作用域在for循环之外,因为i那会循环已经执行完毕,i的值变成6,所以在console.log输出i的时候,i的值已经加到6,打印出来就是6个6

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

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

由于在执行此循环的时候,每次都会在作用域里,创建一个i的内存,并把值存储在内存中。所以相当于创建了6个变量名为i的变量,所以在console.log输出i的时候,打印出来就是0、1、2、3、4、5

3 除了使用 for let 配合,还有什么其他方法可以打印出 0、1、2、3、4、5

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

在循环里每次定义一个常量来记录i自增后的值,然后再输出i,这个也是相当于创建了6个内存来存储每一次i的值,最后再进行打印。