首页新闻找找看学习计划

关于js for循环中的setTimeout()一个问题

0
悬赏园豆:30 [已解决问题] 解决于 2018-07-02 20:13

这里面我知道结果输出得是5,可是为什么是4个5,js是单线程的,setTimeout()执行时for循环已经执行完毕,i++成为5,setTimeout()根据作用域链查找,输出i的结果是5,可是为什么是4个5,for循环不是已经执行完毕了吗?怎么会输出4个5。不太懂,麻烦大家解答一下,谢谢!

for (var i = 1; i <= 4; i++) {
            setTimeout(function () {
                console.log(i); 
            }, 1000)
        }
花语剑情的主页 花语剑情 | 初学一级 | 园豆:5
提问于:2018-06-28 18:34

不好意思,现在才结贴。谢谢大家的解惑,我已经明白了

花语剑情 1年前
< >
分享
最佳答案
0

我是闲来无聊,也不知道题主看了别人的回答是不是已经明白了。
1.for循环执行了四次,所以循环体的代码实际上被运行四次,所以是打印四次。
2.setTimeout(code,ms)指在ms毫秒后执行code代码。这里是一秒,在一秒内for 循环肯定是运行完了,此时i已经被赋值为5,当刚好一秒的时候运行code代码,这里打印变量i,所以打印的结果是5。
综上,打印4个5。

收获园豆:6
Ben_Mario | 菜鸟二级 |园豆:340 | 2018-06-29 01:13
其他回答(8)
0

这个原因是每执行一次for循环,都会有一个setTimeout执行,等到for循环结束了,执行4个setTimeout,而此时i已经等于5,因此执行4次

可以看下这个链接:https://www.jb51.net/article/122489.htm

收获园豆:4
我心悦你 | 园豆:73 (初学一级) | 2018-06-28 19:07
0

小明你好,帮我把苹果放篮子里,一小时后告诉我篮子里一共有几个苹果

小明你好,帮我把苹果放篮子里,一小时后告诉我篮子里一共有几个苹果

小明你好,帮我把苹果放篮子里,一小时后告诉我篮子里一共有几个苹果

小明你好,帮我把苹果放篮子里,一小时后告诉我篮子里一共有几个苹果

 

一小时后...

 

一共有四个苹果

一共有四个苹果

一共有四个苹果

一共有四个苹果

收获园豆:4
幻天芒 | 园豆:36522 (高人七级) | 2018-06-28 22:47
0

你已经知道了 js是单线程的了  单线程的结果就是你现在演示得到的结果

收获园豆:4
思念断了线 | 园豆:263 (菜鸟二级) | 2018-06-29 09:27
0

@幻天芒  解释的太形象了

s_p | 园豆:269 (菜鸟二级) | 2018-06-29 10:33
0

@幻天芒  牛

^keepHungry$ | 园豆:532 (小虾三级) | 2018-06-29 10:43
0

settime是异步执行,要等for循环完执行,i又是引用。当所有的settime开始执行时,i值为5

收获园豆:4
热爱游戏享受生活 | 园豆:208 (菜鸟二级) | 2018-06-29 11:25
0

这个原因是每执行一次for循环,都会有一个setTimeout执行,等到for循环结束了,执行4个setTimeout,而此时i已经等于5,因此执行4次

收获园豆:4
温情亿度开发者 | 园豆:315 (菜鸟二级) | 2018-06-29 12:07
0

for循环是执行完了,但是它启的stetimeout还没执行,4个当然输出4个

收获园豆:4
小光 | 园豆:1830 (小虾三级) | 2018-06-29 13:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册