javascript - for循环中setTimeout的问题

查看:104
本文介绍了javascript - for循环中setTimeout的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

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


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

为什么结果是:
0
1
2
3
4 ,这里打印了4次
延迟的时间为0,为何先执行下面的for循环呢,为何上面的for循环打印的最终的i,下面的for循环是逐个打印呢?

解决方案

1.setTimeout绑定的回调函数只是往Javascript的事件循环机制中注册了一个定时器,这个定时器只可能在当前时间循环的下一次事件循环中才有可能被执行(需要检查时间是否符合设置的时间点)
2.

function  (a) {
 console.log(a);
}(i)

是一个立即执行函数,在你setTimeout函数执行调用时就被执行了,而不是等到定时器到点后被执行
3.setTimeout(fn,0)并不是立即执行的语义,只是说在下一次时间循环到达时可以马上执行
4.打印4次4的问题

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

等价==>

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

输出4次4是因为javacript没有块作用域,只有函数作用域,一个函数在定义时其中俄变量的作用域就确定;函数中变量i的指向的a处声明的变量,在for循环结束后i的值就是4并且你定义了4个同样的定时器

这篇关于javascript - for循环中setTimeout的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆