hand
_1_11_151
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:09:52
在前端开发的世界里,JavaScript 作为一门单线程的语言,却能够处理诸如异步网络请求、定时任务等操作,这背后的功臣就是事件循环(Event Loop)机制。而理解事件循环,就不得不提到宏任务(MacroTask)与微任务(MicroTask)。接下来,我们将深入探索事件循环机制以及宏任务和微任务的奥秘。
JavaScript 是单线程的,这意味着它在同一时间只能执行一个任务。单线程的设计主要是为了避免在操作 DOM 时出现冲突。想象一下,如果多个线程同时对一个 DOM 元素进行修改,就会导致页面渲染混乱。然而,单线程也带来了一个问题:如果遇到耗时的任务,后续的任务就会被阻塞,用户界面会出现卡顿,影响用户体验。为了解决这个问题,JavaScript 引入了异步机制。
JavaScript 的异步操作不会阻塞主线程的执行。例如,当我们发起一个网络请求或者设置一个定时器时,主线程不会等待这些操作完成,而是会继续执行后面的代码。当异步操作完成后,其对应的回调函数会被放入任务队列中等待执行。
任务队列是一个先进先出(FIFO)的数据结构,用于存放异步操作完成后的回调函数。JavaScript 中有两种类型的任务队列:宏任务队列和微任务队列。
宏任务是由宿主环境(如浏览器、Node.js)发起的任务。常见的宏任务包括:
setTimeout
setInterval
setImmediate
(Node.js 环境)requestAnimationFrame
(浏览器环境)微任务是由 JavaScript 引擎自身发起的任务。常见的微任务包括:
Promise.then
async/await
(本质上是基于 Promise 实现的)MutationObserver
(浏览器环境)process.nextTick
(Node.js 环境)任务类型 | 发起者 | 执行时机 | 常见示例 |
---|---|---|---|
宏任务 | 宿主环境 | 每次事件循环开始时执行一个宏任务 | setTimeout 、setInterval |
微任务 | JavaScript 引擎 | 每个宏任务执行完后,会立即执行微任务队列中的所有任务 | Promise.then 、async/await |
事件循环是 JavaScript 实现异步操作的核心机制,它不断地从任务队列中取出任务并执行。事件循环的执行流程如下:
下面是一个简单的代码示例,帮助我们理解事件循环机制:
console.log('1. 主线程同步代码开始');
// 宏任务
setTimeout(() => {
console.log('4. setTimeout 回调函数执行');
}, 0);
// 微任务
Promise.resolve().then(() => {
console.log('3. Promise.then 回调函数执行');
});
console.log('2. 主线程同步代码结束');
1. 主线程同步代码开始
和 2. 主线程同步代码结束
。Promise.resolve().then
,将其回调函数放入微任务队列。setTimeout
,将其回调函数放入宏任务队列。3. Promise.then 回调函数执行
。4. setTimeout 回调函数执行
。事件循环机制是 JavaScript 实现异步操作的关键,它通过宏任务队列和微任务队列的配合,使得 JavaScript 能够在单线程的情况下高效地处理异步任务。理解宏任务和微任务的区别以及事件循环的执行流程,对于编写高效、稳定的 JavaScript 代码至关重要。在实际开发中,我们应该合理使用异步操作,避免出现回调地狱等问题,提高代码的可读性和可维护性。
希望通过本文的介绍,你对 JavaScript 的事件循环机制、宏任务和微任务有了更深入的理解。在今后的前端开发中,能够更好地运用这些知识,解决实际问题。
前端 - Javascript
整章节共299节
快分享给你的小伙伴吧 ~