JavaScript 操作宏任务与微任务

JavaScript 引擎在执行任务时,有两种类型的任务:宏任务(macro task)和微任务(micro task)。它们之间的差别在于执行顺序和触发方式,因此理解它们的区别很重要,也有助于我们编写更高效、优雅的代码。

什么是宏任务和微任务?

在 JavaScript 中,宏任务可以理解为当前执行栈中的任务,例如 script(整体代码)、setTimeout、setInterval、setImmediate、I/O、UI 等事件。当执行栈中的任务执行完毕后,JavaScript 引擎会立即从任务队列中取出一个宏任务执行。

而微任务则是在同一个执行栈中的任务(script 后)、Promise 的回调函数和 DOM 变化事件(例如:input 事件、scroll 事件等)。

需要注意的是,虽然它们在调用顺序上有区别,但它们的本质都是把代码的执行结果放到对应的任务队列中去等待 JavaScript 引擎的执行。

如何操作宏任务和微任务?

在 JavaScript 中,我们通过内置的函数可以很方便地在宏任务和微任务之间进行操作。

操作宏任务

  • setTimeout/setInterval

在 JavaScript 中,可以通过 setTimeout 和 setInterval 来操作宏任务队列。它们都接受两个参数:第一个参数是要执行的函数,第二个参数是时间(毫秒),表示在多长时间之后执行函数。

例如,在 2 秒之后输出一个字符串:

setTimeout(function() {
  console.log('2 秒后输出!');
}, 2000);
  • setImmediate

在 Node.js 中,可以使用 setImmediate 来添加一个宏任务到队列中。与 setTimeout 不同的是,setImmediate 总是在当前队列的尾部,也就是下一个宏任务之前执行。

setImmediate(function() {
  console.log('当前任务执行完后立即输出!');
});

操作微任务

  • Promise

在 JavaScript 中,可以使用 Promise 对象来操作微任务队列。Promise 构造器接收一个函数 argument,它会立即执行,而在该 constructor 内部调用 resolve/reject 则会把对应的 callback 交给微任务队列处理。

例如,在 Promise 中,无论 fulfill 还是 reject 都被认为是一种微任务:

Promise.resolve().then(function() {
  console.log('在 Promise 中输出!');
});
  • MutationObserver

除了 Promise 以外,MutationObserver 也能添加一个微任务到队列中。MutationObserver 提供了一种异步回调解决 liuon 等 DOM 变化问题的简便方法。

例如,在 MutationObserver 中,无论 type 是什么,都会触发一个微任务:

var observer = new MutationObserver(function(mutations) {
  console.log('触发 MutationObserver 了!');
});
observer.observe(document, { attributes: true, childList: true, subtree: true });

题外话

在实际开发中,宏任务和微任务的操作常常被忽略,甚至有开发者直接把 Promise 当做同步操作来使用,这是不正确的。

在开发时,我们需要注意一些细节,比如:Promise 在一个执行栈中最多执行一个 then 。在 Promise 中使用一些 async/await 等语法时,也需要注意它们所产生的微任务,否则可能会出现一些难以排查的 bug。

在实践中,正确地操作宏任务和微任务可以提高代码的性能和可维护性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript 操作宏任务与微任务 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • jquery获取当前日期的方法

    jQuery获取当前日期的方法有多种,常用的有以下三种: 1. 使用JavaScript原生Date对象 可以使用JavaScript原生的Date对象获取当前日期。例如,以下代码可以获取当前日期的年/月/日三个部分: var date = new Date(); var year = date.getFullYear(); var month = date…

    JavaScript 2023年5月27日
    00
  • PHP rawurlencode与urlencode函数的深入分析

    PHP rawurlencode与urlencode函数的深入分析 概述 在网络传输过程中,由于URL不能包含特殊字符,因此需要将URL中的特殊字符进行编码转义。PHP提供了两个函数用于URL编码转义:urlencode()和rawurlencode()。本文将深入分析这两个函数的运行机制及不同之处,以及在什么情况下使用它们。 urlencode() url…

    JavaScript 2023年5月19日
    00
  • JavaScript函数式编程Thunk原理解析

    JavaScript函数式编程Thunk原理解析 本文将详细讲解什么是 JavaScript 函数式编程中的 Thunk,它的原理是什么,以及如何使用 Thunk 来实现异步编程。 什么是 Thunk Thunk 是一种 JavaScript 函数编程的技术。它是一个惰性求值的函数,即只有在需要的时候才会执行。Thunk 函数接受参数,并返回一个不执行任何操…

    JavaScript 2023年5月27日
    00
  • jquery使用正则表达式验证email地址的方法

    使用jQuery的正则表达式验证Email地址的方法可以通过以下步骤完成: 步骤1:编写HTML 首先,需要在HTML中创建一个表单,其中包含一个输入Email地址的文本框和一个提交按钮。例如: <form id="email-form"> <label for="email">Email地址:…

    JavaScript 2023年6月10日
    00
  • js数组去重的hash方法

    当我们在使用 JavaScript 编程时,经常会遇到需要对数组进行去重的情况。这时候,我们可以使用 hash 方法对数组进行去重。以下是 hash 方法的完整攻略,包括原理、步骤以及示例。 什么是 hash 去重法? hash 去重法是一种对 JavaScript 数组进行去重的算法,它的原理是:利用对象属性的唯一性,将数组元素作为对象的属性名,来判断元素…

    JavaScript 2023年5月27日
    00
  • 详解用函数式编程对JavaScript进行断舍离

    详解用函数式编程对JavaScript进行断舍离 函数式编程作为一种编程范式,正变得越来越受JavaScript开发者欢迎。它与传统的面向对象编程就像是石头和剪刀一样。让我们来详细了解一下,如何用函数式编程对JavaScript进行“断舍离”。 什么是函数式编程 函数式编程是一种编程模式,它的核心思想是将计算过程视为数学运算,每个函数都是输入一些参数,返回一…

    JavaScript 2023年6月10日
    00
  • Javascript验证Visa和MasterCard信用卡号的方法

    验证信用卡号的一种常用方法是通过Luhn算法,该算法有一个基本的规则:把信用卡号从右往左依次编号为0到n,其中最右边一位编号为0,然后对于每个奇数编号的数字乘以二,如果乘以二后的结果大于9,则将结果的各位数字相加,得到一个两位数的数字。 接着,将所有乘以二的数字和除了乘以二的数字的和相加,如果得到的和可以被10整除,则该信用卡号为合法的信用卡号。以下是一个检…

    JavaScript 2023年6月10日
    00
  • vue升级之路之vue-router的使用教程

    在Vue.js开发项目中,Vue Router是一个不可或缺的库。它为我们提供了一种方便的方式来管理应用程序的的路由和控制页面的显示内容。本文将提供“Vue升级之路之Vue Router的使用教程”,供大家参考。 安装Vue Router 我们可以使用npm来安装Vue Router,使用以下命令: npm install vue-router 创建Vue …

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部