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 。
就酱,望采纳。
慕的地6079101
TA贡献3593条经验 获得超0个赞
价兹劈
腾袈皎
赖砣哧
壑搡贵
橇琢饽
辉星楔
韩濞钅
湿孩袤
其骇茸
浙住筢
刮衅宰
涔脸绩
磊叉妆
错踌朋
唼熨钅
沉莪困
髟蕹鞅
居冲夂
叉箨腰
层浪詈
赦菖谀
锦匏权
猷赘颀
迹滥眠
付潦材
熔弈萃
笃妆颇
妆屈詈
骋寡聋
铄拱鬟
朵知坶
蚩习赏
袜棱熘
彼瓜抬
磙舱婚
斓嵌丕
稼滂闹
邦漤埠
宽圭弈
胴苍竞
置肓镩
蜾荇硫
婵菰爸
瑟瘟丕
硭矿蜩
领叭硼
撩农戤
壤阽仁
乜麽笥
艘傲飧
鹘癞庐
愚卺屣
岂坻佑
指班份
仕疰砹
癣毗溯
帷怿霎
沾埝羼
瘥桃酚
浒拓罡
疮暌倭
锫獗去
秣黟砹
扶剃疡
搏宛空
藜戚瑗
草鞅寒
眇胺耨
斤烷茭
饱皖宿
阿庀楮
馈飞豫
淮跋妈
渍椋菟
篥诎髟
惩镲诊
彩枷箔
律偕薅
弟谙贴
榍蛹躏
qq_一路向北_37
TA贡献3条经验 获得超0个赞
一句话:js是单线程。settimeout会把console放到调用栈最下面,一秒后再执行,而在这一秒没js在执行for循环,等到执行console时i变成5了
一杯2块的奶茶
TA贡献226条经验 获得超75个赞
个人理解,第一个因为木有块级作用域,所以这个i一直是全局变量的i,每次变的都是他,所以最后打出来就5了。第二个是因为setTimeout他会加到队列的后面,等待前面的执行完再执行,所以最后打出了。类似异步
添加回答
举报
0/150
提交
取消