setTimeout()函数引发的问题

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) 早输出?

知道的朋友希望能详细些解说,谢谢。

http://img4.mukewang.com/5a14f5b5000163e904980306.jpg

慕粉4204745
浏览 2533回答 3
3回答

牛奶老哥哥

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

慕的地6079101

价兹劈 腾袈皎 赖砣哧 壑搡贵 橇琢饽 辉星楔 韩濞钅 湿孩袤 其骇茸 浙住筢 刮衅宰 涔脸绩 磊叉妆 错踌朋 唼熨钅 沉莪困 髟蕹鞅 居冲夂 叉箨腰 层浪詈 赦菖谀 锦匏权 猷赘颀 迹滥眠 付潦材 熔弈萃 笃妆颇 妆屈詈 骋寡聋 铄拱鬟 朵知坶 蚩习赏 袜棱熘 彼瓜抬 磙舱婚 斓嵌丕 稼滂闹 邦漤埠 宽圭弈 胴苍竞 置肓镩 蜾荇硫 婵菰爸 瑟瘟丕 硭矿蜩 领叭硼 撩农戤 壤阽仁 乜麽笥 艘傲飧 鹘癞庐 愚卺屣 岂坻佑 指班份 仕疰砹 癣毗溯 帷怿霎 沾埝羼 瘥桃酚 浒拓罡 疮暌倭 锫獗去 秣黟砹 扶剃疡 搏宛空 藜戚瑗 草鞅寒 眇胺耨 斤烷茭 饱皖宿 阿庀楮 馈飞豫 淮跋妈 渍椋菟 篥诎髟 惩镲诊 彩枷箔 律偕薅 弟谙贴 榍蛹躏

qq_一路向北_37

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

一杯2块的奶茶

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

Stardust1001

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

Stardust1001

因为setTimeout延迟1秒执行的,这个时候,其他的都执行完了
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript