JS函数的执行时机

106 阅读1分钟

在JS中函数调用的时机不同,执行的结果也就不同。

例子:解释为什么一下代码会打印6个6

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

这段代码打印出的是6个6,而不是0,1,2,3,4,5,原因就是setTimeout()所导致的,该方法是设置一个定时器,该定时器在定时器到期后执行一个函数或指定的一段代码。

setTimeout()函数意思是尽快执行,用于等待制定的时间间隔后执行函数,上述代码中此函数嵌套在for循环中,for循环执行了6次,setTimeout()执行6次,“尽快”打印出6次 i 的值,setTimeout()函数执行在for循环之后,for循环执行完成后 i 值为6,setTimeout()函数打印出6次 i为6的值,故代码执行结果是6个6;为什么不是0、1、2、3、4、5呢?原因是i的声明,上述代码中 声明的i 只有一个,一个i只能对应一个值,最后打印出的是 i 的最新值;那为什么不是6个5呢?上述代码中for循环 i<6时,循环才会继续,当 i=6时跳出循环,所以循环结束时 i=6,然后就打印出6个6。

那么如何让上述代码打印出0,1,2,3,4,5呢,就需要简单修改一下:

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

可以看到将let i = 0这句代码放到了for循环中,原因就是JS规定了for和let一起用时,每次for循环都会多创建一个i,保留到setTimeout里,然后继续循环,这样setTimeout里就保留了i的循环0,1,2,3,4,5,所以最后打印了0,1,2,3,4,5。

其他方法:

for(var i = 0;i<6;i++){
    ! function(i){
        setTimeout(()=>{console.log(i)},0)
    }(i); //此函数为立即执行函数,此处的i为局部变量
}