javascript for循环里面的settimeout执行问题

<script>functiontestAnonymous(){varaa=0;varbb=1;for(vari=0;i<3;i++){aa++;bb++;setTime... <script>
function testAnonymous() {
var aa = 0;
var bb = 1;
for(var i = 0; i < 3; i++) {
aa++;
bb++;
setTimeout('alert('+aa+')',1000);
//setTimeout(function(){return testDisplay(aa,bb);},1000);
}
}

testAnonymous()

</script>
问:为什么先出1、再出3、再出2?
为什么不是1、2、3?
展开
 我来答
慕名eib31
2014-07-25 · TA获得超过1923个赞
知道小有建树答主
回答量:1163
采纳率:85%
帮助的人:454万
展开全部

循环是在瞬间完成的,也就是在瞬间启动三个计时器(时间间隔不会超过1毫秒),就好像发令枪响,三个人同时起跑。Javascript的计时器无法精确到8毫秒以内(不记得哪里看到了,也许随着平台改进会有所提升,但别指望能区分1-2毫秒),因此三个alert同时执行可能出现先后。


这与你循环中直接调用alert不同。因为alert会暂停for循环,等关闭alert后执行下面代码。


最好设置不同时值,间距大于10毫秒。你试试这样写

<script>
function testAnonymous() {
   var aa = 0;
   var bb = 1;
   for(var i = 0; i < 3; i++) {
      aa++;
      bb++;
      setTimeout('alert('+aa+')',1000+aa*10);
      //setTimeout(function(){return testDisplay(aa,bb);},1000);
    }
}

testAnonymous()
</script>
追问
你好,这2天我看了setimeout的机制
我想问个另外的情况
如果我把alert 换成console.log的话输出就不会出现1、3、2的情况,这个是什么原因呢

setTimeout(console.log(aa),1000);
追答
alert()会暂停后面的代码,差别也许在这里吧
百度网友84c11da
2014-07-25 · TA获得超过1108个赞
知道小有建树答主
回答量:695
采纳率:100%
帮助的人:403万
展开全部
把 setTimout的时间改成 5000 就知道了

另外alert可能出现阻塞。建议换车console.log 测试。
另外 可以去查看setTimeout的实现原理,它比不是完全按照间隔时间来执行的。受到线程阻塞影响
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式