JavaScript 操作宏任务与微任务

yizhihongxing

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日

相关文章

  • JS中offset和匀速动画详解

    JS中offset和匀速动画详解 在前端开发中,动画效果可以增强用户体验,让页面更加生动。其中,匀速动画是一种基本的动画方式,而offset属性则可以获取一个元素在文档中的位置。 offset属性 offset属性指的是元素的位置偏移值,在JS中通过offsetTop和offsetLeft分别获取元素在文档中的上边界和左边界到包含元素的上边界和左边界之间的像…

    JavaScript 2023年6月10日
    00
  • 12个提高JavaScript技能的概念(小结)

    下面我将详细讲解“12个提高JavaScript技能的概念(小结)”的完整攻略。 1. 箭头函数 箭头函数是 ES6 中的新语法,它可以让我们更方便、简洁地创建函数,而且还有一些特殊的作用域规则。箭头函数的语法示例如下: const sum = (a, b) => a + b; 在上面的示例中,我们定义了一个名为 sum 的箭头函数,它接受两个参数 a…

    JavaScript 2023年5月18日
    00
  • js屏蔽F12审查元素,禁止修改页面代码等实现代码

    实现屏蔽F12审查元素和禁止修改页面代码需要结合JavaScript和HTML的相关特性。以下是一个完整的攻略: 1. 使用JavaScript禁止页面右键功能 在页面中加入以下JavaScript代码,可以禁止页面的右键功能: document.oncontextmenu = function () { return false; } 以上代码中,docu…

    JavaScript 2023年6月10日
    00
  • JavaScript中7种位运算符在实战的妙用

    我们知道,在 JavaScript 中,有7种位运算符号,分别是按位与(&)、按位或(|)、按位异或(^)、左移位(<<)、有符号右移(>>)、无符号右移(>>>)、以及取反(~)。这些运算符虽然不像加减乘除一样常见,在实际开发中却有着广泛的应用。下面我们将讲解这7种运算符在实战中的应用,并用具体的示例进行说…

    JavaScript 2023年5月28日
    00
  • Javascript数组循环遍历之forEach详解

    Javascript数组循环遍历之forEach详解 foreEach()方法的基本使用 JavaScript中的数组可以使用forEach()方法进行遍历,forEach()方法接收一个函数作为参数,该函数将在数组中的每个元素上运行,基本语法如下: array.forEach(function(currentValue, index, arr), this…

    JavaScript 2023年5月27日
    00
  • 深入理解js数组的sort排序

    关于“深入理解js数组的sort排序”,我可以提供以下攻略: 一、sort排序的基本用法 sort是JavaScript中数组的一种方法,用于给数组排序。基本用法如下: array.sort(compareFunction) 其中,array是需要排序的数组,compareFunction是比较函数,可以是可选的。如果指定了比较函数,它将决定排序的顺序。如果…

    JavaScript 2023年5月27日
    00
  • ES6中的rest参数与扩展运算符详解

    ES6中的rest参数与扩展运算符详解 在ES6中,新增了rest参数和扩展运算符这两个语法特性,它们在函数的参数传递过程中非常有用。本文将详细讲解它们的用法和示例。 Rest参数 在ES6中,可以使用rest参数来表示不定数量的参数。具体来说,rest参数是一个数组,它包含了所有传入函数中的不定参数,我们可以使用类似于普通数组的方法来操作它。 functi…

    JavaScript 2023年6月10日
    00
  • JavaScript中的内置对象介绍

    下面是关于JavaScript内置对象的详细介绍: 什么是JavaScript内置对象 JavaScript内置对象指的是在JavaScript语言中可以直接使用的对象,不需要额外的引入或安装。这些内置对象是JavaScript语言的一部分,可以为开发者提供简单、高效的编程方法。 常用的JavaScript内置对象 1.全局对象(Global Object)…

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