首页 > web前端 > js教程 > 正文

为什么一道 JS 打印输出顺序面试题的答案不是 "start 1 2 3 4 5 6"?

霞舞
发布: 2024-11-13 12:30:16
原创
850人浏览过

为什么一道 js 打印输出顺序面试题的答案不是

一道 JS 打印输出顺序面试题的深入探讨

针对面试题中的代码示例,输出顺序为 start 1 2 3 end 4 5 6。乍看之下,似乎与直觉不符,但仔细分析后,我们可以理解背后的原因。

当执行第一个 Promise 时,回调函数中的 console.log('start') 会被立即执行并输出。随后,该 Promise 返回一个新的 Promise,并在同一个微任务队列中调度。在此微任务队列执行之前,第二个 Promise 的第一个 then() 回调函数会执行并输出 1。

此处关键在于第一个 Promise 返回的新 Promise 的消耗时间。如果返回一个空 Promise,则其执行速度非常快,以至于在第一个微任务队列执行之前完成了。这意味着第二个 Promise 的剩余 then() 回调函数会立即执行,并输出 2、3。

那么,第一个 Promise 中的 return Promise.resolve('end') 扮演了什么角色?它确实消耗了一点时间,使得包含 console.log('end') 的回调函数被安排在下一个微任务队列中执行。这解释了为什么 end 会输出在 2 和 3 之间。

值得注意的是,面试题中提及的代码并不是实际面试中常见的场景。在实际应用中,异步执行通常涉及网络请求,它们的响应时间不确定,这也影响了微任务队列的执行顺序。

进一步延伸,假设我们有两个 Promise,每个 Promise 包含一系列 then() 回调函数,并且没有涉及外部网络请求。在这种情况下,callback 进入微任务队列的顺序与 Promise 进入微任务队列的顺序是一致的。因此,代码执行完毕后的输出顺序将是 1 6 2 7 3 8 4 9 5 10。

总之,虽然面试题中的代码示例可能有点 "取巧",但它确实突出了事件循环和微任务队列在 JS 中的工作原理。理解这些原理對於編寫健壯可靠的非同步應用程式至關重要。

以上就是为什么一道 JS 打印输出顺序面试题的答案不是 "start 1 2 3 4 5 6"?的详细内容,更多请关注php中文网其它相关文章!

全能打印神器
全能打印神器

全能打印神器是一款非常好用的打印软件,可以在电脑、手机、平板电脑等设备上使用。支持无线打印和云打印,操作非常简单,使用起来也非常方便,有需要的小伙伴快来保存下载体验吧!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号