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

为什么一道 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″?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1497452.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 19:32:17
下一篇 2025年12月19日 19:32:26

相关推荐

发表回复

登录后才能评论
关注微信