JS函数的执行时机

155 阅读1分钟

从两段代码进行分析

第一段代码

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

·首先我们要了解setTimeout()

setTimeout()设置一个定时器,该定时器在定时器到期后执行一个函数或指定的一段代码。

我们可以理解为,是一会在执行的意思,相当于把手头的事情做完了,马上再去执行接下去的事

·代码执行过程就是通过for循环,setTimeout()这句代码执行了6遍,所以要打印出6个数,且i循环6次结束之后,它的值为6。相当于定了6个闹钟,6个闹钟会依次响起

·为什么没有输入0、1、2、3、4、5,而是输出了6个6?

是因为循环先执行完,执行完之后i=6,再去打印出6次i的值

只有一个i,每次都要打印出他的最新值

第二段代码

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

运行结果为:0、1、2、3、4、5

按照常规思想,我们会认为会和上一段代码输出相同的结果,因为只是把let放到for循环

里,但是为什么打印出来的0、1、2、3、4、5呢?

因为JS被妥协了,按照新人的思想,新人认为应该打印出0、1、2、3、4、5,所以他为了迎合新人,将错就错,就把这段代码结果设为0、1、2、3、4、5

forlet配合,每次进入循环把i复制一份,第一次循环把i=0留在这个空间,第二次循环又把i= 1留在这个空间,不跟随i的变化。6次循环后,会生出6个新的i,再加上本身i=0,一共会创造出7个i