hand
_1_11_152
4
返回栏目
0k
2k
1k
2k
1k
1k
1k
2k
2k
2k
1k
2k
1k
2k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
2k
1k
2k
1k
1k
1k
1k
1k
1k
1k
2k
2k
1k
1k
1k
2k
1k
1k
2k
2k
1k
1k
1k
2k
1k
1k
2k
2k
1k
2k
1k
1k
2k
2k
2k
3k
3k
2k
3k
2k
3k
3k
3k
1k
2k
3k
2k
2k
3k
3k
2k
2k
6k
3k
2k
2k
5k
3k
4k
3k
3k
2k
4k
3k
3k
2k
3k
3k
1k
4k
4k
4k
2k
5k
3k
2k
3k
4k
3k
3k
4k
2k
3k
3k
4k
2k
2k
3k
4k
3k
3k
2k
5k
2k
3k
3k
3k
3k
2k
3k
3k
3k
2k
2k
2k
2k
3k
2k
2k
2k
3k
2k
2k
2k
2k
2k
2k
0.1k
0.2k
3k
2k
3k
2k
0.1k
2k
2k
4k
2k
2k
1k
2k
2k
3k
3k
3k
3k
2k
2k
3k
3k
3k
4k
3k
3k
4k
3k
2k
2k
3k
3k
3k
3k
3k
3k
2k
3k
3k
4k
4k
3k
3k
2k
2k
3k
2k
2k
1k
2k
3k
1k
2k
2k
2k
2k
2k
2k
2k
2k
2k
4k
2k
3k
2k
1k
2k
2k
2k
2k
2k
3k
2k
3k
1k
2k
2k
2k
0k
2k
2k
2k
2k
2k
2k
2k
3k
2k
2k
1k
1k
3k
2k
3k
1k
2k
1k
2k
2k
2k
2k
3k
1k
3k
2k
2k
2k
2k
2k
2k
1k
2k
2k
4k
3k
3k
2k
2k
2k
2k
2k
2k
4k
3k
3k
3k
2k
2k
2k
2k
2k
2k
3k
4k
返回前端 - Javascript栏目
作者:
贺及楼
成为作者
更新日期:2025-02-21 20:10:16
在 JavaScript 中,事件循环(Event Loop)是一个至关重要的概念,它是 JavaScript 实现异步编程的核心机制。由于 JavaScript 是单线程的,这意味着它一次只能执行一个任务。为了处理异步操作,如网络请求、定时器等,事件循环应运而生。下面我们将深入探讨事件循环的执行流程以及具体的执行步骤。
调用栈是 JavaScript 用来管理函数调用的一种数据结构,遵循后进先出(LIFO)的原则。当一个函数被调用时,它会被压入调用栈的顶部;当函数执行完毕后,它会从调用栈中弹出。
任务队列是用来存放异步任务回调函数的地方。在 JavaScript 中,任务队列分为宏任务队列(MacroTask Queue)和微任务队列(MicroTask Queue)。
setTimeout
、setInterval
、setImmediate
(Node.js 环境)、I/O
操作、UI rendering
等。Promise.then
、MutationObserver
、process.nextTick
(Node.js 环境)等。事件循环是一个不断循环的过程,它的主要作用是从任务队列中取出任务并将其放入调用栈中执行。
事件循环的总体执行流程可以概括为以下几个步骤:
下面通过一个具体的例子来详细分析事件循环的执行步骤:
console.log('1. 同步代码开始');
// 宏任务
setTimeout(() => {
console.log('4. setTimeout 回调执行');
}, 0);
// 微任务
Promise.resolve().then(() => {
console.log('3. Promise 微任务回调执行');
});
console.log('2. 同步代码结束');
console.log('1. 同步代码开始')
压入调用栈并执行,输出 1. 同步代码开始
。setTimeout
,这是一个宏任务,将其回调函数放入宏任务队列中等待执行。Promise.resolve().then
,这是一个微任务,将其回调函数放入微任务队列中等待执行。console.log('2. 同步代码结束')
压入调用栈并执行,输出 2. 同步代码结束
。Promise.resolve().then
的回调函数。将该回调函数放入调用栈中执行,输出 3. Promise 微任务回调执行
。setTimeout
的回调函数放入调用栈中执行,输出 4. setTimeout 回调执行
。步骤 | 操作 | 调用栈 | 微任务队列 | 宏任务队列 | 输出结果 |
---|---|---|---|---|---|
1 | 执行同步代码 | console.log('1. 同步代码开始') |
空 | setTimeout 回调 |
1. 同步代码开始 |
setTimeout |
空 | setTimeout 回调 |
|||
Promise.resolve().then |
Promise 回调 |
setTimeout 回调 |
|||
console.log('2. 同步代码结束') |
Promise 回调 |
setTimeout 回调 |
2. 同步代码结束 |
||
2 | 检查微任务队列 | Promise 回调 |
空 | setTimeout 回调 |
3. Promise 微任务回调执行 |
3 | 从宏任务队列中取出一个宏任务 | setTimeout 回调 |
空 | 空 | 4. setTimeout 回调执行 |
事件循环是 JavaScript 实现异步编程的核心机制,通过调用栈、微任务队列和宏任务队列的协同工作,使得 JavaScript 能够高效地处理异步操作。理解事件循环的执行流程和具体步骤,对于编写高性能、无阻塞的 JavaScript 代码至关重要。在实际开发中,我们需要合理使用异步操作,避免出现回调地狱等问题。
希望通过本文的介绍,你对 JavaScript 事件循环有了更深入的理解。在编写代码时,能够更好地处理异步任务,提高代码的性能和可维护性。
前端 - Javascript
整章节共299节
快分享给你的小伙伴吧 ~