Js函数的执行时机

104 阅读1分钟

Js函数的执行时机

taixiaodong 2022.1.25 饥人谷

解释如下代码

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

/*  
  由于setTimeout的影响,这段代码会在执行完for循环结束的时候才马上执行console.log,
由于此时i=6,所以会输出六个6
   setTimeout()方法设置一个定时器,该定时器在定时器到期后执行一个函数或指定的一段代码。
有点类似于刻舟求剑的记号,for是船,for执行完后,记号对应的位置的匕首也发生了变化
   通常程序由上到下顺序执行,遇到函数的声明语句会暂时跳过,直到遇到它相应的函数调用语句,
才会进入相应的函数内部执行其作用域内的语句,
   执行完后返回上一层或者通过其他调用语句跳转到另一个函数内部,因此函数的执行完全取决于他的调用语句,
声明和调用之间可能会发生很多变化
   通过函数调用就可以解决以上问题
*/
解决办法:
let i = 0
for (i = 0; i < 6; i++) {
    (function (a) {
        setTimeout(() => {
            console.log(a)
        }, 0)
    })(i)
}
/*
  这个方法实际上就是将setTImeout语句放到一个匿名函数的内部作用域中,
  当i=0,1,2,3,4,5时分别将它的值传递形式参数a,并调用这个函数作用域内的语句,
虽然依旧在调用结束后输出此时的i,但是由于传递的i的值在发生变化,conlose.log的值也会随之变化
*/