当前位置:首页 > JavaScript

eventloop js实现

2026-02-02 05:07:14JavaScript

Event Loop 的实现原理

JavaScript 的 Event Loop 是单线程异步编程的核心机制,负责协调调用栈、微任务队列和宏任务队列的执行顺序。以下是其核心实现逻辑:

eventloop js实现

调用栈(Call Stack)

调用栈用于跟踪当前执行的函数。当一个函数被调用时,会被推入栈顶;执行完毕后从栈顶弹出。如果栈被同步任务阻塞(如无限循环),浏览器会失去响应。

eventloop js实现

function foo() {
  console.log("foo");
}
function bar() {
  foo();
}
bar(); // 调用栈顺序: bar -> foo

任务队列(Task Queues)

异步任务被分为两类队列:

  • 宏任务队列(Macrotask Queue):包含 setTimeoutsetInterval、I/O 操作、UI 渲染等。
  • 微任务队列(Microtask Queue):包含 Promise.thenMutationObserverqueueMicrotask

Event Loop 循环流程

  1. 执行调用栈中的同步代码,直到栈为空。
  2. 检查微任务队列,依次执行所有微任务,直到队列清空。
  3. 渲染页面(如果需要)。
  4. 从宏任务队列取出一个任务执行,回到步骤 1。
console.log("Start");

setTimeout(() => console.log("Timeout"), 0);

Promise.resolve().then(() => console.log("Promise"));

console.log("End");
// 输出顺序: Start -> End -> Promise -> Timeout

手动模拟简单 Event Loop

以下是一个极简的 Event Loop 模拟实现:

class EventLoop {
  constructor() {
    this.macroQueue = []; // 宏任务队列
    this.microQueue = []; // 微任务队列
  }

  // 添加宏任务
  addMacroTask(task) {
    this.macroQueue.push(task);
  }

  // 添加微任务
  addMicroTask(task) {
    this.microQueue.push(task);
  }

  // 启动循环
  run() {
    while (true) {
      // 执行所有微任务
      while (this.microQueue.length > 0) {
        const task = this.microQueue.shift();
        task();
      }

      // 执行一个宏任务
      if (this.macroQueue.length > 0) {
        const task = this.macroQueue.shift();
        task();
      }
    }
  }
}

// 使用示例
const loop = new EventLoop();
loop.addMacroTask(() => console.log("Macro 1"));
loop.addMicroTask(() => console.log("Micro 1"));
loop.addMacroTask(() => console.log("Macro 2"));
loop.run();
// 输出顺序: Micro 1 -> Macro 1 -> Macro 2

关键注意事项

  • 微任务优先级高于宏任务:每次调用栈清空后,会先执行所有微任务。
  • 避免阻塞 Event Loop:长时间同步代码会阻塞渲染和任务执行。
  • Node.js 差异:Node.js 中 process.nextTick 的优先级高于微任务,且宏任务分为多个阶段(如 setImmediate)。

标签: eventloopjs
分享给朋友:

相关文章

js实现vue

js实现vue

Vue.js 的基本实现方法 在 JavaScript 中实现 Vue.js 的功能,可以通过直接引入 Vue 库或使用现代构建工具(如 Vite 或 Webpack)。以下是几种常见的实现方式:…

js实现vue路由

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue-r…

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval…