javascript - 怎样解决定时器里i的问题
PHPz
PHPz 2017-04-11 13:21:57
[JavaScript讨论组]

这段代码如果不加封闭空间(被注释部分),一直弹6,加了封闭空间就没有规律的乱弹了,哪位大神能帮忙解决一下定时器里i的问题(换成timeout也是不好使的),让他在定时器里面弹出0,1,2,3,4,5,

PHPz
PHPz

学习是最好的投资!

全部回复(4)
天蓬老师

不加闭包,引用的都是同一个i,自然都是6。

后面那个很有趣,当你不是用alert显示i,而是用log显示i时,它必然是有序的,这说明回调是按顺序压入执行线程的,所以alert的乱序和setTimeout或者setInterval本身没关系。

那为什么会乱序呢?这是因为alert会打断程序的执行,阻塞执行线程,会导致setTimeout和setInterval的结果具有不确定性,自然就不能保证顺序。

所以结论是,不要用alert。

黄舟

你要什么效果?问题不明确啊,直接输出0,1,2,3,4,5这种?如果是这样的话,那么应该使用setTimeOut

巴扎黑

没规律的乱弹,是因为所有的6个闭包函数几乎同时执行,然后每隔300ms再次执行,循环往复……
所以在浏览器上执行结果是看不出来任何顺序。

改成setTimeout是可以达到你的目的的。

for (var i=0; i<6; i++) {                                                           
  (function(j) {                                                                         
    setTimeout(function() {                                                         
      console.log(j);                                                               
    }, j*1000);                                                                     
  })(i);                                                                            
}
黄舟

不想用闭包的话,直接用es6的let吧。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号