JS 函数的执行时机

182 阅读1分钟
let i = 0
for(i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}

上面的代码执行结果是6个6,因为settimeout函数是指定某个任务在主线程最早可得的空闲时间执行,意思就是不用再等多少秒了,只要主线程执行栈内的同步任务全部执行完成,栈为空就马上执行。而即便主线程为空,0毫秒实际上也是达不到的。根据HTML的标准,最低是4毫秒。for循环先执行,最后i=6,而循环执行了6次,所以结果是6个6。

but

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

执行的结果是0,1,2,3,4,5,这时let会单独创建一个作用域,即:

(let i = 0) {
    setTimeout(()=>{
        console.log(i)
    },0)
}

(let i = 1) {
    setTimeout(()=>{
        console.log(i)
    },0)
}

(let i = 2) {
    setTimeout(()=>{
        console.log(i)
    },0)
};
(let i = 3) {
    setTimeout(()=>{
        console.log(i)
    },0)
}

(let i = 4) {
    setTimeout(()=>{
        console.log(i)
    },0)
}

(let i = 5) {
    setTimeout(()=>{
        console.log(i)
    },0)
};

参考:juejin.cn/post/684490…