这里面我知道结果输出得是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) }
我是闲来无聊,也不知道题主看了别人的回答是不是已经明白了。
1.for循环执行了四次,所以循环体的代码实际上被运行四次,所以是打印四次。
2.setTimeout(code,ms)指在ms毫秒后执行code代码。这里是一秒,在一秒内for 循环肯定是运行完了,此时i已经被赋值为5,当刚好一秒的时候运行code代码,这里打印变量i,所以打印的结果是5。
综上,打印4个5。
这个原因是每执行一次for循环,都会有一个setTimeout执行,等到for循环结束了,执行4个setTimeout,而此时i已经等于5,因此执行4次
可以看下这个链接:https://www.jb51.net/article/122489.htm
小明你好,帮我把苹果放篮子里,一小时后告诉我篮子里一共有几个苹果
小明你好,帮我把苹果放篮子里,一小时后告诉我篮子里一共有几个苹果
小明你好,帮我把苹果放篮子里,一小时后告诉我篮子里一共有几个苹果
小明你好,帮我把苹果放篮子里,一小时后告诉我篮子里一共有几个苹果
一小时后...
一共有四个苹果
一共有四个苹果
一共有四个苹果
一共有四个苹果
你已经知道了 js是单线程的了 单线程的结果就是你现在演示得到的结果
settime是异步执行,要等for循环完执行,i又是引用。当所有的settime开始执行时,i值为5
这个原因是每执行一次for循环,都会有一个setTimeout执行,等到for循环结束了,执行4个setTimeout,而此时i已经等于5,因此执行4次
for循环是执行完了,但是它启的stetimeout还没执行,4个当然输出4个
不好意思,现在才结贴。谢谢大家的解惑,我已经明白了
– 花语剑情 6年前