首页 新闻 会员 周边

关于setTimeout定时器问题~~

0
[已解决问题] 解决于 2017-05-26 15:24
for (var i = 0; i < 5; i++) {
setTimeout(function () {
console.log(i);
}, i * 1000);

}
 
这串代码显示的是 每隔一秒显示一个5,一开始我以为是从0开始显示每隔一秒增加1,后来运行代码发现是5个5,但是我不明白其中的原理,求告知!!!
 
 
而且还有这两串代码不明白其中原理,代码如下:
1、
for (var i = 0; i < 5; i++) {
(function (i) {
setTimeout(function () {
console.log(i);
}, i * 1000);
})(i)
}
 
 
2、
for (var i = 0; i < 5; i++) {
(function () {
setTimeout(function () {
console.log(i);
}, i * 1000);
})(i)
}
 
求大神告知其中原理!!
奋斗的少年-欧耶的主页 奋斗的少年-欧耶 | 菜鸟二级 | 园豆:214
提问于:2017-05-24 19:49
< >
分享
最佳答案
0

因为JS的异步机制,循环很快就执行完了,等到执行回调console出来的时候,i是最后一个值,也就是5。

奖励园豆:5
trustme326 | 菜鸟二级 |园豆:391 | 2017-05-24 21:44

 非常感谢,,刚刚上网搜了关于JS异步处理机制的帖子    是不是能说明事件队列对函数的执行起到了影响!!

奋斗的少年-欧耶 | 园豆:214 (菜鸟二级) | 2017-05-24 23:28

@奋斗的少年-欧耶 我也只是一知半解而已,具体原理你还是继续找一下大神们的解析吧(∩_∩)

trustme326 | 园豆:391 (菜鸟二级) | 2017-05-25 00:47

@trustme326: 恩恩  好的  还是非常感谢你~~

奋斗的少年-欧耶 | 园豆:214 (菜鸟二级) | 2017-05-25 09:52
其他回答(1)
0

定时器是异步执行 , 你可以通过闭包将i 当参数传递进去  才能输出 1,2,3,4,5

 

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

})(i)

你是在不懂;就记住(function(){  你的自己写的函数 })(i)  就这样,用壳子把你自己的逻辑包裹起来

老年游侠 | 园豆:364 (菜鸟二级) | 2017-05-24 23:16

刚刚看了一楼提供的网上关于JS异步处理工作机制,这个是否可以解释,为什么会出现这样的效果呢??  我感觉用这套理论来说明的话比较合理!!

支持(0) 反对(0) 奋斗的少年-欧耶 | 园豆:214 (菜鸟二级) | 2017-05-24 23:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册