当前位置:首页 > JavaScript

js实现eventloop

2026-03-14 12:42:07JavaScript

实现 JavaScript Event Loop

JavaScript 的 Event Loop 是其异步编程的核心机制。以下是实现 Event Loop 的关键步骤:

理解 Event Loop 的基本结构

Event Loop 由调用栈(Call Stack)、任务队列(Task Queue)和微任务队列(Microtask Queue)组成。调用栈负责执行同步代码,任务队列存放宏任务(如 setTimeout),微任务队列存放微任务(如 Promise)。

模拟调用栈和队列

创建一个简单的调用栈和队列结构来模拟 Event Loop 的行为:

const callStack = [];
const macroTaskQueue = [];
const microTaskQueue = [];

处理同步代码

同步代码直接推入调用栈并执行:

function executeSyncCode(task) {
    callStack.push(task);
    console.log(`Executing: ${task}`);
    callStack.pop();
}

处理异步代码

异步任务(如 setTimeout)被推入宏任务队列:

function setTimeoutAsync(callback, delay) {
    macroTaskQueue.push(() => {
        setTimeout(() => {
            callStack.push(callback);
            callback();
            callStack.pop();
        }, delay);
    });
}

处理微任务

微任务(如 Promise)被推入微任务队列,并在当前宏任务执行完成后立即执行:

function promiseAsync(callback) {
    microTaskQueue.push(() => {
        Promise.resolve().then(() => {
            callStack.push(callback);
            callback();
            callStack.pop();
        });
    });
}

Event Loop 主循环

实现一个简单的 Event Loop 主循环,优先处理微任务队列,再处理宏任务队列:

function eventLoop() {
    while (microTaskQueue.length > 0) {
        const task = microTaskQueue.shift();
        task();
    }

    if (macroTaskQueue.length > 0) {
        const task = macroTaskQueue.shift();
        task();
    }

    if (callStack.length === 0 && macroTaskQueue.length === 0 && microTaskQueue.length === 0) {
        console.log("Event Loop idle");
        return;
    }

    setTimeout(eventLoop, 0);
}

示例用法

以下代码演示了如何使用上述实现的 Event Loop:

executeSyncCode(() => console.log("Sync Task 1"));

setTimeoutAsync(() => console.log("Macro Task 1"), 1000);
promiseAsync(() => console.log("Micro Task 1"));

executeSyncCode(() => console.log("Sync Task 2"));

eventLoop();

输出顺序

运行上述代码后,输出顺序为:

js实现eventloop

Sync Task 1
Sync Task 2
Micro Task 1
Macro Task 1
Event Loop idle

关键点

  • 微任务队列优先级高于宏任务队列。
  • 每次宏任务执行完成后,会清空微任务队列。
  • setTimeoutPromise 是典型的宏任务和微任务。

通过以上实现,可以清晰地理解 JavaScript Event Loop 的工作机制。

标签: jseventloop
分享给朋友:

相关文章

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。 &…

js实现选题

js实现选题

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

js画图实现

js画图实现

使用Canvas API绘制图形 Canvas是HTML5提供的绘图API,通过JavaScript操作Canvas元素可以绘制各种图形。以下是一个简单的示例: <canvas id="myC…

js实现密码

js实现密码

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