for循环中使用setTimeout的问题,进阶版

在知乎看到的一个题目,不明白为什么结果是123

for(var i=1;i<=4;i++){
    var time=setTimeout(function(i){
        clearTimeout(time);
                console.log(i);
    },1000,i);
}

//输出结果1,2,3

阅读 2.2k
2 个回答

打印一句console.log("cleartime:", time),你就明白了为什么最后一次 4 没有打印出来.

for (var i = 1; i <= 4; i++) {
    var time = setTimeout(
        function(i) {
            console.log("cleartime:", time);
            clearTimeout(time);
            console.log(i);
        }, 1000, i );
}

cleartime: 4
1
cleartime: 4
2
cleartime: 4
3

也就是说,虽然通过定时器传参避免了i共享, 但是 var time 却共享,每次都是清除的ID 4, 所以最后4没有打印出来.

这是因为for循环是同步的,而时间模块比如setTimeOut是异步的同步做完了异步可能还在处理中,所以出来的结果会先前于之前的操作,至于为什么不是1234 是因为你每次清楚了下超时调用,不满足条件退出循环最后输出123

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题