在 JavaScript 中,事件循环(Event Loop)是一种机制,用于处理异步任务的执行顺序和调度。
事件循环包含一个主线程和一个任务队列(Task Queue)。主线程负责执行同步任务,而异步任务会被分发到不同的队列中等待执行。
宏任务(Macro Task)通常包括以下几个:
- script(整体代码块)
- setTimeout、setInterval、setImmediate
- I/O 操作、网络请求
微任务(Micro Task)通常包括以下几个:
- Promise.then()、Promise.catch()、Promise.finally()
- process.nextTick (Node.js独有)
- MutationObserver (浏览器独有)
- Object.observe (已废弃)
当主线程中的当前宏任务执行完毕后,会立即检查微任务队列。如果微任务队列不为空,则按照先进先出的顺序依次执行微任务,直到微任务队列为空。然后再继续下一个宏任务的执行。
下面是一个简单的示例来说明时间循环中宏任务和微任务的执行顺序:
console.log('Script start');
setTimeout(function () {
console.log('setTimeout');
}, 0);
Promise.resolve().then(function () {
console.log('Promise');
});
console.log('Script end');
输出结果为:
Script start
Script end
Promise
setTimeout
在上述代码中,整体代码块属于第一个宏任务。setTimeout
是一个宏任务,而Promise
是一个微任务。因此,先输出了主线程中同步的代码(Script start 和 Script end),然后执行微任务队列中的 Promise,最后执行宏任务队列中的 setTimeout。
需要注意的是,在每个宏任务执行完毕后,如果有新的微任务添加到微任务队列中,会继续清空微任务队列,直到队列为空才会进行下一个宏任务的执行。这也就是为什么在上面示例中,Promise 的回调函数比 setTimeout 先执行。
总结:
- 宏任务是由浏览器或 Node.js 环境提供的异步操作。
- 微任务是由 JavaScript 自身提供的一种机制,用于处理异步操作。
- 事件循环通过主线程和任务队列来处理和调度宏任务和微任务的执行顺序。
内容由零声教学AI助手提供,问题来源于学员提问