JS 宏任务 微任务
时间: 2023-08-31 08:08:58 浏览: 99
JS中的宏任务(macro task)和微任务(micro task)是用来管理异步任务执行顺序的概念。
宏任务是由浏览器提供的异步任务,比如setTimeout、setInterval、I/O操作等。宏任务会被放入到事件队列(event queue)中,在主线程中执行。当主线程空闲时,会从事件队列中取出一个宏任务进行执行。
微任务是由JavaScript引擎提供的异步任务,比如Promise的回调函数、MutationObserver等。微任务会在当前宏任务执行完毕后立即执行。微任务的执行时机在宏任务之前,这意味着它们具有更高的优先级。
在一次事件循环中,当一个宏任务执行完成后,会立即检查是否有微任务需要执行。如果有,则依次执行所有的微任务,直到微任务队列为空。然后再执行下一个宏任务。
简而言之,宏任务是由浏览器提供的异步任务,而微任务是由JavaScript引擎提供的异步任务。在事件循环中,微任务具有更高的优先级,会在下一个宏任务之前执行。
相关问题
js宏任务和微任务
在 JavaScript 中,事件循环(Event Loop)是一个非常重要的概念。事件循环是一种机制,用于执行异步任务,以保证 JavaScript 在单线程的情况下能够处理多个任务。
在事件循环中,我们通常将任务分为宏任务(macro task)和微任务(micro task)两类。
宏任务是由浏览器或 Node.js 的 API 提供的异步任务,例如 setTimeout、setInterval、requestAnimationFrame、I/O 操作等。这些任务会被添加到任务队列(task queue)中,当主线程执行完当前任务后,会从队列中取出一个宏任务执行,直到队列为空。
微任务则是在当前任务执行结束后立即执行的异步任务,例如 Promise 的回调函数、MutationObserver 的回调函数等。这些任务会被添加到微任务队列(microtask queue)中,当主线程执行完当前任务后,会从微任务队列中按顺序取出所有任务执行,直到队列为空。
需要注意的是,微任务的执行优先级高于宏任务,也就是说,在执行宏任务过程中,如果有微任务需要执行,会先执行完所有微任务,然后再执行下一个宏任务。
下面是一个示例代码,用于演示宏任务和微任务的执行顺序:
```javascript
console.log('start');
setTimeout(() => {
console.log('setTimeout');
}, 0);
Promise.resolve().then(() => {
console.log('Promise');
});
console.log('end');
```
上述代码中,先执行同步代码,输出 `start` 和 `end`,然后将 `setTimeout` 函数添加到宏任务队列中,并将 Promise 的回调函数添加到微任务队列中。最后,按顺序取出微任务队列中的任务,输出 `Promise`,再取出宏任务队列中的任务,输出 `setTimeout`。
输出结果如下:
```
start
end
Promise
setTimeout
```
js宏任务与微任务的区别
宏任务和微任务是JavaScript异步编程中的两个概念。宏任务包括当前执行栈中执行的任务、setTimeout/setInterval、用户交互事件等。而微任务则包括Promise.then()、process.nextTick()等。宏任务会被放到一个任务队列中,而微任务则被放在一个微任务队列中。当当前执行栈中的任务运行完毕后,会先执行微任务队列中的所有任务,然后再取出宏任务队列中的第一个任务并执行。这是宏任务和微任务的最主要的区别。
阅读全文