JavaScript 事件循环中的微任务和宏任务是什么

JavaScript 事件循环中的微任务和宏任务是什么

事件循环: JavaScript中的事件循环是一个不断运行的过程,它监视调用堆栈。它的主要功能是检查调用堆栈是否为空。如果调用堆栈为空,事件循环就会执行等待在任务队列中的所有回调函数。在任务队列中,任务被广泛地分为两类,即微任务和宏任务。

事件循环中的微任务: 微任务是在创建它的函数或程序退出且JavaScript执行堆栈为空之后被执行的函数,但在返回控制给用户代理以驱动脚本的执行环境的事件循环之前。微任务还能够入队其他微任务。

通常会为需要在当前脚本执行完成后立即完成的事物安排微任务。在完成一个宏任务后,事件循环转移到微任务队列。只有在微任务队列中的所有任务完成后,事件循环才会转移到微任务队列之外的下一个任务。这意味着微任务队列具有更高的优先级。

一旦微任务队列中的所有任务完成,事件循环才会切换回宏任务队列。将微任务队列置于优先位置的主要原因是为了改善用户体验。在给定任何其他JavaScript不在中间执行的情况下,微任务队列在回调之后进行处理。微任务包括变异观察器回调和Promise回调。

在添加新的微任务到队列中的情况下,这些额外的微任务将被添加到微队列的末尾,并且会被处理。这是因为即使添加了新任务,事件循环仍会继续调用微任务,直到队列中没有更多的微任务为止。使用微任务的另一个重要原因是确保任务的有序执行,同时减少用户造成的延迟风险。

语法: 添加微任务:

queueMicrotask(() => {
    // Code to be run inside the micro-task 
});
JavaScript

微任务函数本身不接受参数,也不返回任何值。

示例: process.nextTick、Promises、queueMicrotask、MutationObserver

事件循环中的宏任务: 宏任务表示一些离散且独立的工作。它们总是执行JavaScript代码,并且微任务队列为空。宏任务队列通常被认为与任务队列或事件队列相同。然而,宏任务队列与任务队列的唯一小差别在于,任务队列用于同步语句,而宏任务队列用于异步语句。

在JavaScript中,直到事件发生后,才允许执行代码。{值得 mentioning 的是,JavaScript 代码执行本身也是一个宏任务。}事件被排队为宏任务。当当前正在执行的宏任务队列中的任务被执行时,可能会注册新的事件,从而创建并添加到队列中。

在初始化时,JavaScript 引擎首先从宏任务队列中取出第一个任务并执行回调处理程序。然后,JavaScript 引擎将这些异步函数发送到 API 模块,并在适当的时间将它们推送到宏任务队列中。一旦进入宏任务队列,每个宏任务都需要等待事件循环的下一轮。以这种方式执行代码。

所有记录的微任务将在一个宏任务执行循环中一次性处理完毕。相比之下,宏任务队列具有较低的优先级。宏任务包括解析 HTML、生成 DOM、执行主线程 JavaScript 代码以及其他事件,如页面加载、输入、网络事件、计时器事件等。

示例: setTimeout、setInterval、setImmediate、requestAnimationFrame、I/O、UI 渲染。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册