从两段代码进行分析
第一段代码
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
for
和let
配合,每次进入循环把i复制一份,第一次循环把i=0留在这个空间,第二次循环又把i= 1留在这个空间,不跟随i的变化。6次循环后,会生出6个新的i,再加上本身i=0,一共会创造出7个i