49. JS 单线程模型的本质与浏览器协作机制 副本.md

查看飞书原文 ↗2,925 字符

1. 核心概念 (Core Concept)

JavaScript 的单线程模型指的是:运行 JavaScript 代码的线程只有一个,同一时间只能执行一个任务。

2. 为什么需要它? (The "Why")

3. API 与用法 (API & Usage)

由于单线程,JavaScript 的执行是线性的。为了处理耗时操作(如网络请求、定时器、事件处理),浏览器引入了异步机制。这主要依赖以下概念:

事件循环的执行顺序大致为:

  1. 执行当前宏任务(比如整个 script 代码块)。
  2. 执行过程中遇到的同步任务立即执行,异步任务的回调放入对应的任务队列。
  3. 当前宏任务执行完毕。
  4. 检查微任务队列,执行所有可用的微任务(直到微任务队列为空)。
  5. 执行渲染(如果需要)。
  6. 开始下一个宏任务(通常是从宏任务队列中取出一个)。

这是一个基础的事件循环示例概念代码(非真实的浏览器内部实现代码):

// 简化概念代码,非真实引擎实现
function eventLoop() {
    while (true) {
        // 1. 执行一个宏任务 (例如,从任务队列取出最早的)
        let task = getNextMacrotaskFromQueue();
        if (task) {
            executeTask(task);

            // 2. 执行所有微任务
            while (microtaskQueueIsNotEmpty()) {
                let microtask = getNextMicrotaskFromQueue();
                executeTask(microtask);
            }

            // 3. 渲染 (如果需要)
            if (shouldRender()) {
                 render();
            }
        } else {
             // 没有宏任务了,可以休息一下或者等待新任务
             waitForNewTask();
        }
    }
}

实际开发中,我们通过使用异步 API 来利用浏览器的协作机制:

console.log('Start'); // 同步任务

setTimeout(function() {
  console.log('setTimeout callback'); // 宏任务回调,进入任务队列
}, 0); // 即使延迟为0,它仍然是宏任务

Promise.resolve().then(function() {
  console.log('Promise then'); // 微任务回调,进入微任务队列
});

console.log('End'); // 同步任务

// 输出顺序: Start -> End -> Promise then -> setTimeout callback

4. 关键注意事项 (Key Considerations)

5. 参考资料 (References)


原文链接与附件索引