当前位置:首页 > 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实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

js手势实现

js手势实现

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

js实现求导

js实现求导

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

js钟表实现

js钟表实现

实现JavaScript钟表的基本方法 创建一个简单的JavaScript钟表可以通过以下步骤完成,涵盖数字和模拟两种形式。 数字钟表实现 HTML结构只需一个显示时间的容器: <div i…