登录
首页 >  文章 >  前端

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

时间:2024-12-17 20:40:04 454浏览 收藏

小伙伴们对文章编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《为什么一道 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 中的工作原理。理解这些原理對於編寫健壯可靠的非同步應用程式至關重要。

今天带大家了解了的相关知识,希望对你有所帮助;关于文章的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>