您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# JavaScript中宏任务和微任务有哪些
## 前言
在JavaScript的异步编程模型中,理解**宏任务(MacroTask)**和**微任务(MicroTask)**的执行机制至关重要。本文将深入探讨它们的分类、执行顺序以及实际应用场景,帮助开发者掌握事件循环的核心原理。
---
## 一、什么是宏任务和微任务?
### 1. 基本概念
- **宏任务**:由浏览器或Node.js环境调度的任务,例如`setTimeout`、`setInterval`等。
- **微任务**:在当前任务执行结束后立即执行的任务,例如`Promise.then()`、`MutationObserver`。
### 2. 事件循环中的执行顺序
JavaScript引擎遵循以下流程:
1. 执行一个宏任务(如脚本整体)
2. 执行所有微任务
3. 渲染页面(如有需要)
4. 开始下一个宏任务
---
## 二、宏任务的主要类型
### 1. 定时器类
- **`setTimeout` / `setInterval`**
延迟执行或周期性执行的代码,属于典型的宏任务。
```javascript
setTimeout(() => console.log('Timeout 1'), 0);
fs.readFile
的回调函数。XMLHttpRequest
或fetch
的回调(注意:fetch
的then
属于微任务)。requestAnimationFrame
setImmediate
(Node.js特有)setTimeout(fn, 0)
更优先。click
、scroll
等DOM事件。Promise.then()
/ Promise.catch()
/ Promise.finally()
Promise.resolve().then(() => console.log('Promise 1'));
new MutationObserver(() => console.log('DOM changed')).observe(...);
queueMicrotask
queueMicrotask(() => console.log('Microtask'));
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
Promise.then()
按顺序执行。setTimeout
。setTimeout(() => console.log(1), 0);
Promise.resolve()
.then(() => console.log(2))
.then(() => console.log(3));
console.log(4);
答案:4 → 2 → 3 → 1
button.addEventListener('click', () => {
Promise.resolve().then(() => console.log('Microtask'));
setTimeout(() => console.log('Macrotask'));
});
点击后输出顺序为:Microtask
→ Macrotask
。
nextTick
优先使用微任务实现DOM更新后的回调。queueMicrotask
分批执行。process.nextTick
vs setImmediate
process.nextTick
:微任务,优先级最高。setImmediate
:宏任务,在事件循环的检查阶段执行。Node.js事件循环分为6个阶段,宏任务分布在不同的阶段(如poll
、check
)。
类型 | 常见API | 执行时机 |
---|---|---|
宏任务 | setTimeout , setInterval , I/O |
下一次事件循环 |
微任务 | Promise.then , queueMicrotask |
当前任务结束后立即执行 |
理解两者的区别和协作机制,能够帮助开发者编写更高效、可预测的异步代码。
”`
注:实际字数可能因格式略有差异,建议通过Markdown工具查看完整统计。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。