为了账号安全,请及时绑定邮箱和手机立即绑定

setTimeout()函数引发的问题

setTimeout()函数引发的问题

慕粉4204745 2017-11-22 11:58:25
for (var i = 0; i < 5; i++) {    setTimeout(function() {        console.log('i: ',i);    }, 1000);}console.log(i);都是这是前端的经典面试题,但是却都没找到一个好的解析,我有两个问题,希望大家解答1.为什么console.log('i: ',i);输出的都是5?2.为什么console.log(i) 比 console.log('i: ',i) 早输出?知道的朋友希望能详细些解说,谢谢。
查看完整描述

3 回答

?
牛奶老哥哥

TA贡献204条经验 获得超92个赞

setTimeout是异步函数会挂机然后等所有同步代码执行完后才会开始执行,所以for循环会循环完 i = 5,console.log(i) 会先执行,然后挂机的五个setTimeout 开始执行,在一秒后输出 i:5 。
就酱,望采纳。

查看完整回答
4 反对 回复 2017-11-22
?
qq_一路向北_37

TA贡献3条经验 获得超0个赞

一句话:js是单线程。settimeout会把console放到调用栈最下面,一秒后再执行,而在这一秒没js在执行for循环,等到执行console时i变成5了

查看完整回答
反对 回复 2017-11-22
?
一杯2块的奶茶

TA贡献226条经验 获得超75个赞

个人理解,第一个因为木有块级作用域,所以这个i一直是全局变量的i,每次变的都是他,所以最后打出来就5了。第二个是因为setTimeout他会加到队列的后面,等待前面的执行完再执行,所以最后打出了。类似异步

查看完整回答
反对 回复 2017-11-22
?
Stardust1001

TA贡献261条经验 获得超78个赞

其他部分已经执行完了,然后1秒钟过去了,执行setTimeout,这个时候i也已经加到5过了

查看完整回答
反对 回复 2017-11-22
?
Stardust1001

TA贡献261条经验 获得超78个赞

因为setTimeout延迟1秒执行的,这个时候,其他的都执行完了

查看完整回答
反对 回复 2017-11-22
  • 3 回答
  • 0 关注
  • 2532 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信