JS 函数的执行时机

86 阅读1分钟

大家觉得代码一最后会打印出什么呢?

代码一

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

打印 0、1、2、3、4、5还是6个6?

答案是6个6,为什么会是6个6呢?

这几行代码,其中 setTimeout表示等循环结束打印(0表示等0秒,即立即),等到循环结束开始打印,所以每循环一次, setTimeout相当定了一次闹钟

这个过程是循环先执行,先判断for循环里的i,如果i符合条件才会进入循环体。

首先i=0,for循环第一次,定一个闹钟,过会执行,然后i=1,for循环第二次,定第二个闹钟,过会执行,......,一直到i=5,for循环第6次,定第六个闹钟,过会儿执行。此时订了6个闹钟;

注意当i=6时,不满足循环条件,跳出了循环,这时闹钟依次响起,立即开始依次打印,所以打印结果是6个6

代码二

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

代码二看上去跟代码一似乎没差别,那打印出来是不是也应该是6个6呢?

No,让我们运行一下:

image.png

此时打印出0,1,2,3,4,5

那究竟为啥仅仅去掉初始值,打印就不一样呢

答案是: 因为for循环里面的i前面加了let,形成块状作用域,每次循环会多创建一个i,就会打印出012345

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