扫码关注官方订阅号
这段代码如果不加封闭空间(被注释部分),一直弹6,加了封闭空间就没有规律的乱弹了,哪位大神能帮忙解决一下定时器里i的问题(换成timeout也是不好使的),让他在定时器里面弹出0,1,2,3,4,5,
学习是最好的投资!
不加闭包,引用的都是同一个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吧。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
不加闭包,引用的都是同一个i,自然都是6。
后面那个很有趣,当你不是用alert显示i,而是用log显示i时,它必然是有序的,这说明回调是按顺序压入执行线程的,所以alert的乱序和setTimeout或者setInterval本身没关系。
那为什么会乱序呢?这是因为alert会打断程序的执行,阻塞执行线程,会导致setTimeout和setInterval的结果具有不确定性,自然就不能保证顺序。
所以结论是,不要用alert。
你要什么效果?问题不明确啊,直接输出0,1,2,3,4,5这种?如果是这样的话,那么应该使用setTimeOut
没规律的乱弹,是因为所有的6个闭包函数几乎同时执行,然后每隔300ms再次执行,循环往复……
所以在浏览器上执行结果是看不出来任何顺序。
改成setTimeout是可以达到你的目的的。
不想用闭包的话,直接用es6的let吧。