详解JS事件循环及宏任务微任务的原理

让我们来详细讲解JavaScript事件循环及宏任务和微任务的原理。

什么是JavaScript事件循环

JavaScript事件循环是一种执行JavaScript代码的机制,它负责管理执行栈,并且从任务队列中获取任务。事件循环是JavaScript运行时的一个重要组成部分,同时JavaScript的异步执行正是基于事件循环实现的。

事件循环的执行过程

事件循环的执行过程可以分为以下几个步骤:

  1. 将同步任务压入执行栈中,依次执行;
  2. 执行过程中,如果遇到异步任务,将其挂起,并加入任务队列中;
  3. 同步任务执行完成后,事件循环开始执行任务队列中的任务;
  4. 从任务队列中取出一个任务,如果该任务是一个宏任务,则将其加入到执行栈中并执行;
  5. 如果是一个微任务,则执行该任务;
  6. 一次循环执行完所有的任务,开始下一次循环。

宏任务和微任务

JavaScript中的任务可以分为两种类型:宏任务和微任务。

宏任务是指在JavaScript主线程上执行的任务,包括但不限于setTimeout/setInterval、setImmediate、I/O操作等。宏任务的执行顺序是按照它们被创建的顺序排列的。

微任务是指在宏任务执行过程中被添加到任务队列中的任务。微任务包括Promise中的回调函数、MutationObserver、process.nextTick等。微任务的执行顺序是在当前宏任务执行结束后立即执行。

任务队列和优先级

事件循环的任务队列可以被分为多个不同的队列。不同队列之间的优先级不同。其中,每个宏任务有自己的队列,微任务也有一个独立的队列,在宏任务执行结束时,会立即执行它们。

以下是两个示例:

示例一:setTimeout与Promise回调

console.log('1');

setTimeout(function() {
  console.log('2');
}, 0);

Promise.resolve().then(function() {
  console.log('3');
});

console.log('4');

输出结果为:

1
4
3
2

解释:首先,打印出1。然后,执行setTimeout,将其加入宏任务队列中。接着,调用Promise.resolve(),将其加入到微任务队列中。执行console.log('4'),打印出4。然后,同步任务执行完毕,开始执行微任务队列中的任务,输出3。最后,事件循环开始执行宏任务队列中的任务,输出2。

示例二:MutationObserver

var observer = new MutationObserver(function(mutations) {
  console.log('mutations');
});

observer.observe(document.body, {
  attributes: true
});

document.body.setAttribute('class', 'test');

输出结果为:mutations

解释:首先,创建MutationObserver对象,并将其加入到微任务队列中。然后,执行document.body.setAttribute('class', 'test'),触发MutationObserver的回调函数,输出mutations。

结论

JavaScript的事件循环机制以及宏任务和微任务的概念都是很重要的。我们需要深入了解它们,以了解JavaScript的异步执行机制和实现方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解JS事件循环及宏任务微任务的原理 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • javascript iframe跨域详解

    下面详细讲解 JavaScript Iframe 跨域的完整攻略,说到 iframe,一定要涉及到跨域问题。当 iframe 页面和父页面处于不同域时,由于同源策略的限制,JavaScript 无法获取到 iframe 页面的内容,也无法操作 iframe 页面中的元素。但是,在某些场景下,我们需要在父页面中嵌入一个 iframe 来展示一个来自不同域的页面…

    JavaScript 2023年6月11日
    00
  • JavaScript整除运算函数ceil和floor的区别分析

    下面我来为你讲解一下“JavaScript整除运算函数ceil和floor的区别分析”。 1. 序言 在 JavaScript 中,Math.ceil() 和 Math.floor() 都是用于实现上取整和下取整操作的函数。在实际开发过程中,这两个函数经常被用来计算数据的精度。但是这两个函数之间还是有一些微小的差异,接下来我们将会逐一解释它们之间的区别。 2…

    JavaScript 2023年6月11日
    00
  • JavaScript使用encodeURI()和decodeURI()获取字符串值的方法

    JavaScript使用encodeURI()和decodeURI()获取字符串值的方法 在JavaScript中,有时候需要将字符串数据转换成URI格式,或者从URI格式中获取字符串数据。这时候可以使用encodeURI()和decodeURI()方法来完成转换。 encodeURI() encodeURI()方法将字符串数据作为URI进行编码,其中一些字…

    JavaScript 2023年5月19日
    00
  • 详解javascript高级定时器

    详解JavaScript高级定时器 在JavaScript中,定时器是一种非常强大的机制,它允许你在未来的某个时间点执行某些代码。在本文中,我们将探讨JavaScript高级定时器的各种用法和技巧。 setTimeout setTimeout允许你在一定的延迟之后执行一段代码。语法如下: setTimeout( function() { // 在这里写需要执…

    JavaScript 2023年6月11日
    00
  • JavaScript代码编写中各种各样的坑和填坑方法

    JavaScript是一门广泛使用的语言,但在编写代码时会遇到各种各样的坑。以下是JavaScript代码编写中的一些常见坑和对应的填坑方法: 坑1:变量作用域问题 JavaScript中的变量作用域是函数级别的,而不是基于代码块的。如果在函数外部声明变量,则变量将成为全局变量,可能会导致变量的混淆和意外赋值。填坑方法是在函数内部使用var、let或cons…

    JavaScript 2023年5月28日
    00
  • Javascript Global parseFloat() 函数

    JavaScript Global对象中的parseFloat()函数用于将一个字符串解析为浮点数。如果该字符串无法解析为浮点数,则返回NaN。以下是关于parseFloat()函数完整攻略,包括两个示例说明。 JavaScript Global对象中的parseFloat()函数 JavaScript Global对象中的parseFloat()函数用于将…

    JavaScript 2023年5月11日
    00
  • js动态设置div的值下例子

    下面让我来详细讲解“js动态设置div的值”的完整攻略。 基本概念 在开始具体的实现代码之前,我们先来了解一下这个问题的基本概念。 动态设置div的值:指的是通过JavaScript脚本代码实现在网页中的某个元素(如div)中动态设置内容,而不是直接在HTML代码中写死。 实现过程 实现动态设置div的值可以分为以下两个步骤: 1. 获取div元素 在Jav…

    JavaScript 2023年6月11日
    00
  • JavaScript中Cookie操作实例

    JavaScript中,我们可以使用Cookie来存储一些小型的文本数据,例如用户的登录状态、用户的个性化设置等等。Cookie的使用在网站中非常普遍,具有非常重要的意义。下面是JavaScript中“Cookie操作实例”的完整攻略。 一、什么是Cookie Cookie是由服务器传给客户端的一小段信息,客户端请求后就会一起发送到服务器上。例如,我们可以使…

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