猿问

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


holdtom
浏览 1095回答 2
2回答

大话西游666

打印一句console.log("cleartime:", time),你就明白了为什么最后一次 4 没有打印出来.for&nbsp;(var&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;<=&nbsp;4;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;time&nbsp;=&nbsp;setTimeout(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function(i)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log("cleartime:",&nbsp;time); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clearTimeout(time); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(i); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;1000,&nbsp;i&nbsp;);} cleartime:&nbsp;41cleartime:&nbsp;42cleartime:&nbsp;43也就是说,虽然通过定时器传参避免了i共享, 但是&nbsp;var time&nbsp;却共享,每次都是清除的ID&nbsp;4, 所以最后4没有打印出来.

慕森王

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

相关分类

Html5
CSS3
我要回答