目录
1.宏任务和微任务
JavaScript中的宏任务(MacroTask)和微任务(MicroTask)是异步任务的两种类型,它们主要与事件循环(Event Loop)相关。
- 宏任务(MacroTask):宏任务是一种大的异步任务,例如:script(整体代码)、setTimeout、setInterval、setImmediate(Node.js环境)、I/O操作(如Node.js中的read/write)、UI渲染(浏览器独有)等。每当宏任务执行完毕,事件循环就会检查微任务队列。
- 微任务(MicroTask):微任务是一种小的异步任务,例如:Promise、process.nextTick(Node.js环境)、MutationObserver(浏览器环境)等。当宏任务执行完毕,事件循环就会检查微任务队列,如果微任务队列有任务,那么就会把微任务放入宏任务队列的队尾,等待下一次宏任务的执行。
在JavaScript的事件循环中,一次循环可能会执行多个宏任务,但是在任意一次循环中,微任务都只会执行一次。这是因为当一个宏任务执行完毕后,事件循环会立即查看微任务队列并执行所有的微任务,这就保证了微任务的及时性和优先级。
以下是一个关于宏任务和微任务的大体执行顺序的简单记忆:
- 执行单个宏任务。
- 在每个宏任务执行结束后,检查微任务队列。
- 将所有的微任务添加到宏任务队列的末尾。
- 重复执行步骤1和2,直到宏任务队列为空。
这就保证了在单次事件循环中,微任务的执行始终在宏任务之后,并且如果在一个宏任务执行结束后没有新的宏任务进来,那么事件循环会立即执行所有的微任务。
2.微任务和宏任务有哪些
宏任务包括:script(整体代码)、setTimeout、setInterval、setImmediate(Node.js环境)、I/O操作(如Node.js中的read/write)、UI渲染(浏览器独有)等。
微任务包括:Promise、process.nextTick(Node.js环境)、MutationObserver(浏览器环境)等。
3.微任务和宏任务是怎么执行的
JavaScript的执行机制是单线程的,为了实现异步操作,JavaScript使用了任务队列(Task Queue)来存储宏任务和微任务。
宏任务的执行过程如下:
- 当代码执行到script(整体代码)、setTimeout、setInterval、setImmediate(Node.js环境)、I/O操作(如Node.js中的read/write)、UI渲染(浏览器独有)等宏任务时,会把这些任务添加到宏任务队列中。
- 每当事件循环执行完一个宏任务后,就会检查微任务队列,如果微任务队列有任务,就会把微任务添加到宏任务队列的队尾,等待下一次宏任务的执行。
- 在单次事件循环中,会依次执行所有的宏任务,直到宏任务队列为空。
微任务的执行过程如下:
- 当代码执行到Promise、process.nextTick(Node.js环境)、MutationObserver(浏览器环境)等微任务时,会把这些任务添加到微任务队列中。
- 每当一个宏任务执行结束后,事件循环就会检查微任务队列,如果微任务队列有任务,就会把微任务添加到宏任务队列的队尾,等待下一次宏任务的执行。
- 在单次事件循环中,微任务只会被执行一次,无论它在宏任务执行结束后被添加了多少次。
总的来说,在单次事件循环中,先执行所有的宏任务,然后在每个宏任务执行结束后检查微任务队列,并将所有的微任务添加到宏任务队列的末尾。这样就能保证在单次事件循环中,微任务的执行始终在宏任务之后,并且如果在一个宏任务执行结束后没有新的宏任务进来,那么事件循环会立即执行所有的微任务。