JS函数的执行时机

107 阅读1分钟

1 为什么如下代码会打印 6 个 6

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

首先需要明白一件事,setTimeout(func,0)的情况下是怎么回事,设置的等待时间为0,并不代表立马执行,这样调度表示让 func 尽快执行。但是只有当前正在执行的脚本执行完成后,调度程序才会调用它。详细可了解以下JavaScript的事件循环 :zh.javascript.info/event-loop 也就是说,对于上述的代码来说,必须将for循环执行结束后才可以执行setTimeout,当 i===5 时满足判断条件i<6,之后执行循环体触发setTimeout等待,则执行i++操作,所以i为6,且不符合条件,for循环结束,接下来则执行刚才触发的setTimeout,i的变化为0 -> 1 -> 2 -> 3 -> 4 -> 5 ,一共触发了6次setTimeout,而i的最终值此时为6所以代码最后打印出6个6;

2 以下代码可打印出来 0、1、2、3、4、5

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

3 其余方法打印出0、1、2、3、4、5、

采用闭包的方式

for(var i=0;i<6;i++){
        (function(j){   //j = i
            setTimeout(function(){
                console.log(j);
            },0)
        })(i);
    }
    console.log(i);

定时器

    for(var i=0;i<6;i++){
        setTimeout(function(j){
            console.log(j);
        },0,i)
    }
    
    console.log(i);