宏任务和微任务怎么执行的
时间: 2024-06-07 15:10:26 浏览: 117
宏任务和微任务都是异步任务,在JavaScript中执行时,它们被放入不同的任务队列中,分别被称为宏任务队列和微任务队列。
当JavaScript引擎遇到一个宏任务时,它会将该任务放入宏任务队列中。当当前执行栈为空时,JavaScript引擎会从宏任务队列中取出第一个任务,并将其放入当前执行栈中执行,直到执行完毕或者遇到异步操作。
当JavaScript引擎遇到一个微任务时,它会将该任务放入微任务队列中。而当当前执行栈为空时,JavaScript引擎会先执行微任务队列中的所有任务,直到该队列为空,然后才会从宏任务队列中取出下一个任务执行。
这意味着微任务始终优先于宏任务执行,因为在JavaScript引擎执行完当前宏任务后,它会先清空微任务队列中的所有任务,然后再执行下一个宏任务。
相关问题
宏任务和微任务执行顺序
在JavaScript中,宏任务和微任务是用来管理异步代码执行顺序的机制。
宏任务(Macro Task)是指由浏览器提供的任务队列中的任务,例如setTimeout、setInterval、DOM事件等。宏任务会在主线程执行完当前的同步任务后执行。
微任务(Micro Task)是指由Promise、MutationObserver等API产生的任务。微任务会在当前宏任务执行完毕后立即执行,也就是说微任务会在下一个宏任务之前执行。
执行顺序如下:
1. 执行当前宏任务的同步代码;
2. 执行当前宏任务产生的微任务,直到微任务队列为空;
3. 更新渲染;
4. 执行下一个宏任务,重复上述步骤。
宏任务和微任务
在 JavaScript 中,宏任务和微任务都是异步操作的执行单元。
宏任务包括:script(整体代码)、setTimeout、setInterval、I/O 操作、UI 渲染等。当执行完一个宏任务后,会清空所有微任务队列,然后执行下一个宏任务。
微任务包括:Promise.then、Promise.catch、Promise.finally、MutationObserver 等。当一个微任务队列中的所有任务都执行完毕后,会立即执行下一个宏任务。如果在执行微任务过程中又产生了新的微任务,则会加入到当前微任务队列的末尾,等待下一次执行。
举个例子:
```javascript
console.log('start');
setTimeout(function () {
console.log('setTimeout');
}, 0);
Promise.resolve()
.then(function () {
console.log('promise1');
})
.then(function () {
console.log('promise2');
});
console.log('end');
```
输出的结果为:
```
start
end
promise1
promise2
setTimeout
```
因为 setTimeout 是一个宏任务,所以会先执行整个 script,输出 start 和 end,然后将 setTimeout 加入到宏任务队列中。而 Promise.then 是一个微任务,所以会在当前宏任务执行完毕后立即执行,输出 promise1 和 promise2。最后执行宏任务队列中的 setTimeout,输出 setTimeout。
阅读全文