首页新闻找找看学习计划

js问题求详解,这个代码为什么出来是4个4?

0
悬赏园豆:5 [已解决问题] 解决于 2016-01-19 11:51

var arr = [1,2,3,4];
    for(var i=0;i<arr.length;i++){
            setTimeout(function(){
                 console.log(i)
               })
         }

 

这个代码为什么输出是4个4?求详解

有主机上线的主页 有主机上线 | 初学一级 | 园豆:199
提问于:2016-01-14 18:57
< >
分享
最佳答案
1

setTimeout是个异步定时函数,js是单线程,所以就算延时为0,它也是要等到for循环执行完了,才到它执行,每执行一次for语句就会就会产生一个异步执行,放在等待队列里,所以最后执行时就是输出4个4了。

收获园豆:2
qifan | 菜鸟二级 |园豆:237 | 2016-01-15 08:52
其他回答(4)
-1

这样写。

var arr = [1,2,3,4];

for (var i = 0; i < arr.length; i++) {
  setTimeout(function (i) {
    console.log(i);
  }(i));
}

收获园豆:1
Jayden-EN | 园豆:203 (菜鸟二级) | 2016-01-14 21:45
1

这是标准的闭包问题。到最后执行console.log(i)的时候。这个i已经变成4了。所以输出4个4。

收获园豆:1
幻天芒 | 园豆:36594 (高人七级) | 2016-01-14 22:29
1

JS是單線程執行,意思是一次只能做一件事

setTimeout設定的是"1毫秒後執行"

但實際上是"如果當前沒有正在執行的工作,1毫秒後執行"

就你的案例,當前正在執行for迴圈

所以你的setTimeout裡的function要等到迴圈執行完才會被執行

迴圈竟然已經執行完,i當然是4囉

收获园豆:1
RosonJ | 园豆:3198 (老鸟四级) | 2016-01-15 08:53
0

闭包引起的问题.

我是糖糖 | 园豆:446 (菜鸟二级) | 2016-01-15 11:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册