84669 personnes étudient
152542 personnes étudient
20005 personnes étudient
5487 personnes étudient
7821 personnes étudient
359900 personnes étudient
3350 personnes étudient
180660 personnes étudient
48569 personnes étudient
18603 personnes étudient
40936 personnes étudient
1549 personnes étudient
1183 personnes étudient
32909 personnes étudient
这段代码如果不加封闭空间(被注释部分),一直弹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吧。
不加闭包,引用的都是同一个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吧。