JS函数的执行时机

先看一段代码

let i = 0;
for (i = 0; i < 6; i++) {
    setTimeout(() => {
        console.log(i)
    }, 0)
}
// 执行输出 6,6,6,6,6,6

这里输出6个6是因为是JavaScript在执行的时候,会将setTimeout()放入任务队列,等待主线程的执行(不阻塞主线程)全部执行完成后,再通过event loop去询问任务队列中是否有可执行的代码,再继续放入主线程中执行。即for循环执行完成后再去执行setTimeout()。

而变量i是全局变量,每一次循环,变量i的值都会发生改变,循环结束执行setTimeout(),此时i的值为6,所以就会打印出6个6。

有什么方法可以打印出0,1,2,3,4,5呢 ?

方法1: 使用局部变量

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

let声明的变量只在本轮循环有效,所以每一次循环的i其实都是一个新的变量。JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。

__方法2: __去掉setTimeout

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

方法3: 为setTimeout添加参数

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

一旦定时器到期,它们会作为参数传递给function。

方法4: 使用闭包

for(var i=0;i<6;i++){
    (function(i){
         setTimeout(()=>{
            console.log(i);
        }, 0);
    })(i)
}
全部评论

相关推荐

05-14 20:34
门头沟学院 Java
窝补药贝八股:管他们,乱说,反正又不去,直接说680
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务