当前位置:首页 > JavaScript

eventloop js实现

2026-03-15 04:49:15JavaScript

Event Loop 的 JavaScript 实现

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

eventloop js实现

调用栈与任务队列

调用栈(Call Stack)用于跟踪当前执行的函数,遵循后进先出原则。当栈为空时,Event Loop 会检查任务队列。

eventloop js实现

任务分为宏任务(如 setTimeout)和微任务(如 Promise),分别进入不同的队列:

  • 宏任务队列:script 整体代码、setTimeoutsetInterval、I/O 操作等。
  • 微任务队列:Promise.thenMutationObserverqueueMicrotask

Event Loop 处理流程

  1. 执行当前调用栈中的同步代码,直至栈空。
  2. 处理微任务队列:依次执行所有微任务,直到队列为空。如果微任务中又产生新的微任务,会继续执行。
  3. 渲染更新(浏览器环境下):执行 UI 渲染、布局、绘制等操作。
  4. 从宏任务队列取出一个任务(如最早的 setTimeout 回调)执行,回到步骤 1。

简单代码模拟

// 模拟宏任务和微任务队列
const macroTaskQueue = [];
const microTaskQueue = [];

// 模拟 Event Loop
function eventLoop() {
  // 执行所有微任务
  while (microTaskQueue.length) {
    const task = microTaskQueue.shift();
    task();
  }

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

  // 循环检查
  setTimeout(eventLoop, 0);
}

// 启动 Event Loop
eventLoop();

// 示例:添加任务
macroTaskQueue.push(() => {
  console.log('宏任务 1');
  microTaskQueue.push(() => console.log('微任务 1'));
});

macroTaskQueue.push(() => console.log('宏任务 2'));

关键特性

  • 微任务优先级高于宏任务:每次调用栈清空后,会先彻底清空微任务队列。
  • 避免阻塞:长时间同步代码会阻塞 Event Loop,导致界面卡顿。
  • process.nextTick(Node.js):优先级高于微任务,属于当前阶段立即执行。

实际应用场景

  • 异步顺序控制:通过 Promise 确保逻辑在微任务阶段执行。
  • 批量 UI 更新:将 DOM 操作合并到一次宏任务中减少重绘。
  • 高优先级任务:使用 queueMicrotask 插队执行紧急任务。

理解 Event Loop 的优先级和队列机制,可以避免常见的异步陷阱(如 setTimeout 延迟不精确)。

标签: eventloopjs
分享给朋友:

相关文章

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let co…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(f…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似:…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…