一文详解JavaScript中的事件循环(event loop)机制

作者:木棉

时间:2026-10-31

浏览:618

本文深入解析JavaScript单线程环境下的异步核心机制——事件循环。详细阐述调用栈、消息队列的工作原理,区分宏任务与微任务的执行优先级,并通过示例代码演示Start、End、Promise及Timeout的具体输出顺序,帮助开发者掌握异步编程的执行逻辑。

文章目录

事件循环的运作机制主要包含以下几个关键组成部分:

调用栈(Call Stack)

调用栈是一种用于管理函数调用的数据结构。当函数被调用时,它会被压入栈中,表示当前正在执行;函数执行结束后,则从栈中弹出。该结构遵循后进先出(LIFO)原则。

消息队列(Message Queue)

消息队列用于存放待处理的消息或任务,这些通常由异步操作产生,例如定时器、事件处理程序或网络请求。每条消息包含一个回调函数及相关数据。

事件循环(Event Loop)

事件循环是一个持续运行的进程,负责不断检查调用栈和消息队列。其工作流程如下:

  • 首先检查调用栈是否为空,若为空则等待新任务进入。
  • 若调用栈不为空,则检查消息队列中是否有待处理的消息。
  • 若消息队列中有消息,事件循环会将该消息对应的回调函数压入调用栈执行。
  • 回调函数执行完毕后,从调用栈弹出,并继续检查消息队列中的下一个消息。
  • 该过程不断重复,确保异步任务在合适的时机被执行。

宏任务和微任务

在消息队列中,任务被划分为宏任务(macro task)和微任务(micro task)两类:

  • 宏任务包括定时器回调、事件处理程序、I/O 操作等,它们被放入消息队列等待执行。
  • 微任务包括 Promise 的回调函数、async/await 的异步函数等,其优先级高于宏任务,会在当前宏任务执行完毕后立即执行。

事件循环优先执行所有微任务,随后才执行宏任务。这确保了微任务能在下一个宏任务开始前执行,从而提升对异步操作的响应速度。

示例

以下是一个简单的示例,演示了事件循环的工作流程:

console.log("Start");

setTimeout(function () {
  console.log("Timeout");
}, 0);

Promise.resolve().then(function () {
  console.log("Promise");
});

console.log("End");

输出顺序将是:

  1. “Start”
  2. “End”
  3. “Promise”
  4. “Timeout”

在此示例中,setTimeout 回调被放入宏任务队列,而 Promise 回调被放入微任务队列。因此,微任务会在宏任务之前执行。

总之,事件循环是 JavaScript 异步编程的核心机制之一,它确保了异步任务的有序执行,使得 JavaScript 单线程环境下的异步操作得以实现。

写在最后

到此这篇关于一文详解JavaScript中的事件循环(event loop)机制的文章就介绍到这了,更多相关JavaScript事件循环机制内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章