for循环中的setTimeout问题

原创内容,转载请标记出处:https://blog.csdn.net/yihanzhi/article/details/79565628

//for循环1
for (var i = 0; i < 3; i++) {
    setTimeout(function () {
        console.log(i);
    },0);
}
//for循环2
for (var i = 0; i < 3; i++) {
    setTimeout(function  (a) {
        console.log(a);
    }(i),0);
}
输出结果是:0,1,2,3,3,3

输出结果可能会引起你的两点质疑:
1)延迟的时间同样为0,为何先执行下面的for循环呢?
2)为何循环1处的for循环输出结果都是3,循环2处的for循环是0,1,2呢?

疑点解答:
1)延迟的时间同样为0,为何先执行下面的for循环呢?

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

函数后加()表示是一个立即执行函数,在setTimeout函数执行调用时就被执行了,而不是等到定时器到点后被执行;而setTimeout(fn,0)并不是立即执行,只是表示下一次事件循环到达时可以马上执行
备注:setTimeout绑定的回调函数只是往Javascript的事件循环机制中注册了一个定时器,这个定时器只可能在当前事件循环的下一次事件循环中才有可能被执行。

2)为何循环1处的for循环输出结果都是3,循环2处的for循环是0,1,2呢?

for (var i = 0; i < 3; i++) {
   setTimeout(function  () {
        console.log(i);
    },0);
}
等价于
var i;//代码行1
for (i = 0; i < 3; i++) {
    setTimeout(function  () {
        console.log(i);
    },0);
}

因为var声明的变量作用于函数作用域,函数中变量i指向代码行1处声明的变量,在for循环结束后i的值就是3,所以setTimeout执行时,其中的变量i值已经是3,为此输出结果均是3。
循环2处的setTimeout中的函数是立即执行函数,不会等待定时器到点后再执行;可以把setTimeout中立即执行函数看作setTimeout外的普通函数,所以输出结果合乎我们的意料。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值