当前位置:首页 > JavaScript

js eventloop实现

2026-03-14 03:53:54JavaScript

JavaScript 事件循环实现原理

JavaScript 的事件循环(Event Loop)是其异步编程的核心机制,通过单线程处理非阻塞 I/O 操作。以下是其实现的关键组成部分:

调用栈(Call Stack)

调用栈用于跟踪当前执行的函数。当函数被调用时,它会被推入栈顶;执行完毕后弹出。同步代码按顺序执行,阻塞栈直到完成。

function foo() {
  console.log('foo');
}
function bar() {
  foo();
  console.log('bar');
}
bar();
// 输出顺序: foo → bar

任务队列(Task Queue)

异步操作(如 setTimeoutfetch)的回调函数会被放入任务队列。事件循环在调用栈为空时,将队列中的任务推入栈执行。

console.log('Start');
setTimeout(() => console.log('Timeout'), 0);
console.log('End');
// 输出顺序: Start → End → Timeout

微任务队列(Microtask Queue)

Promise 和 MutationObserver 的回调属于微任务,优先级高于普通任务(宏任务)。每次调用栈清空后,会先处理所有微任务。

js eventloop实现

Promise.resolve().then(() => console.log('Microtask'));
setTimeout(() => console.log('Macrotask'), 0);
// 输出顺序: Microtask → Macrotask

事件循环流程

  1. 执行同步代码:填充调用栈直至清空。
  2. 检查微任务队列:全部执行完毕,直到队列为空。
  3. 渲染更新(如需要):执行 UI 渲染。
  4. 处理宏任务:取一个任务执行,重复步骤 2-4。

代码示例分析

console.log('Script start');

setTimeout(() => {
  console.log('setTimeout');
}, 0);

Promise.resolve()
  .then(() => console.log('Promise 1'))
  .then(() => console.log('Promise 2'));

console.log('Script end');

// 输出顺序:
// Script start → Script end → Promise 1 → Promise 2 → setTimeout

常见异步场景

  • 宏任务setTimeoutsetInterval、I/O 操作、UI 渲染。
  • 微任务Promise.thenqueueMicrotaskMutationObserver

Node.js 与浏览器的差异

  • Node.js:使用 libuv 实现事件循环,包含多个阶段(如 pollcheck)。
  • 浏览器:由渲染引擎(如 V8)管理,与 DOM 渲染紧密结合。

通过理解事件循环的优先级和队列机制,可以避免常见的异步陷阱(如竞态条件),并优化代码执行顺序。

标签: jseventloop
分享给朋友:

相关文章

js防抖和节流实现

js防抖和节流实现

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

js实现 功能

js实现 功能

在 JavaScript 中实现功能通常涉及多个关键步骤,具体取决于功能需求。以下是常见功能的实现方法和示例: 基本功能实现 使用函数封装逻辑是最直接的方式。例如,实现一个计算两数之和的函数: f…

js实现菜单

js实现菜单

实现基本HTML结构 使用HTML创建菜单的基本框架,通常包含<ul>和<li>元素。示例结构如下: <ul id="menu"> <li><…

js 实现图片轮播

js 实现图片轮播

基础实现方案 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS负责样式布局,JavaScript处理轮播逻辑。 <div class="…

js实现文件夹

js实现文件夹

使用JavaScript创建文件夹 在浏览器端的JavaScript中无法直接操作文件系统创建文件夹,这是出于安全考虑。但在Node.js环境中可以通过文件系统模块(fs)实现。 Node.js中使…

js 实现截图

js 实现截图

使用html2canvas库实现截图 html2canvas是一个流行的JavaScript库,可将HTML元素转换为Canvas,进而导出为图片。 安装库: npm install ht…