JS事件循环机制event loop宏任务微任务原理解析

yizhihongxing

接下来我会详细讲解一下JS事件循环机制(event loop)、宏任务和微任务的原理,以及该如何理解它们之间的关系。

1. 事件循环机制(event loop)的原理

在JavaScript中,事件循环机制定义了一种代码执行模型,可以控制代码在何时执行。事件循环机制主要分为以下两个部分:

  • 执行栈(Execution Context Stack)
  • 任务队列(Task Queue)

我们可以将代码执行栈看做是一个存储函数执行上下文的地方,每当调用一个函数,就会将其对应的执行上下文压入栈中,并等待执行完毕。而任务队列则存储了当前已经准备好的任务,它们会在其他任务执行完成后,由事件循环机制取出来执行。

当JavaScript引擎首次遇到全局代码时,它会创建一个全局执行上下文,并将它压入执行栈中。而后续的任何JavaScript代码执行,都会通过执行栈中不断地加入和弹出执行上下文来实现。

在事件循环机制中,除了主线程(执行栈)之外,还有一个任务队列(Task Queue)。任务队列会接受异步任务并按照顺序存储起来,这些异步任务又分为两种类型:宏任务和微任务。

2. 宏任务和微任务的原理

宏任务

宏任务指的是那些需要进入事件队列与其他事件竞争执行权的代码块,例如:load事件、定时器事件(setTimeout、setInterval)等。

当执行栈为空时,事件循环机制会从宏任务队列中取出任务来执行,执行时期间可能会导致执行栈中再次压入执行上下文,也可能会影响变量的状态。当执行过程完成后,事件循环机制会在检查当前宏任务队列和微任务队列是否为空的情况下,执行位于队列头部的任务。

示例:

console.log('1');
setTimeout(() => {
  console.log('2');
}, 0);
console.log('3');

执行结果:

1
3
2

很显然,setTimeout函数会被放入宏任务队列中,而由于发生了异步调用,因此不会阻止主线程的执行。最后,任务队列中的宏任务被执行,并打印出“2”

微任务

微任务指的是在JavaScript引擎执行栈为空并且调用栈中的所有函数都已经返回的情况下,需要执行的代码块,例如Promise回调函数、MutationObserver监听等。

当执行栈为空时,事件循环机制会优先处理微任务队列中的任务,如果没有微任务需要处理,则会切换到宏任务队列中的事件。

示例:

console.log(1);

setTimeout(() => {
  console.log(2);
});

new Promise(resolve => {
  console.log(3);
  resolve(4);
}).then((value) => {
  console.log(value);
});

console.log(5);

执行结果:

1
3
5
4
2

在以上的示例中,Promise回调函数会被放入微任务队列中,而由于异步调用发生在“35”行代码之后,因此在主线程执行完之前,Promise回调函数就已经被放入了微任务队列中,事件循环机制就会在执行完成主线程中的执行栈之后,优先执行Promise回调函数这个微任务。最终,任务队列中的宏任务被执行,并打印出“2”。

结语

以上就是JS事件循环机制和宏任务微任务的完整攻略。通过对比分析,我们可以得出一条结论:无论是宏任务还是微任务,事件循环机制都会按照队列中的顺序依次执行它们。根据实际的业务场景,可以将需要执行的代码加入到微任务或宏任务队列中,帮助JavaScript引擎更好地控制代码的执行时机。

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

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

相关文章

  • 找到了一篇jQuery与Prototype并存的冲突的解决方法

    下面是完整的攻略。 找到了一篇jQuery与Prototype并存的冲突的解决方法 在开发网页时,有时需要同时使用 jQuery 和 Prototype 这两个 JavaScript 库。但是,由于两者都使用了 $ 符号作为入口点,导致它们之间发生了冲突,这使得我们不能同时使用它们。在这里,我们将提供一种解决冲突的方法。 1. 使用jQuery.noConf…

    JavaScript 2023年6月11日
    00
  • js几秒以后倒计时跳转示例

    下面我将为您提供“js几秒以后倒计时跳转示例”的完整攻略。 示例一:使用window.setTimeout()方法实现倒计时跳转 首先,在HTML页面中添加一个div元素,用于显示倒计时的时间: <div id="countdown">5</div> 接下来,添加以下JavaScript代码: // 获取倒计时di…

    JavaScript 2023年5月27日
    00
  • JS读取XML文件示例代码

    下面是JS读取XML文件的完整攻略。 一、读取XML文件的基本原理 在JS读取XML文件时,可以通过以下步骤实现: 创建一个 XMLHttpRequest对象; 打开文件并发送请求; 监听请求状态; 接收响应; 解析XML数据。 在以上步骤中,创建XMLHttpRequest对象和打开文件并发送请求的方法是固定的,而解析XML数据则需要使用不同的方法,这取决…

    JavaScript 2023年5月27日
    00
  • Javascript 遍历对象中的子对象

    Javascript 遍历对象中的子对象通常使用递归的方式实现,具体步骤如下: 1. 判断对象是否为字典 使用 typeof 运算符判断对象类型是否为 object,进一步判断该对象是否为字典(即 {} 类型),如果不是,则直接输出当前对象: function traverseObject(obj, indentation) { if (typeof obj…

    JavaScript 2023年5月27日
    00
  • JavaScript实现短信倒计时60s

    当需要在网页中添加短信验证码的时候,我们通常需要一个倒计时的功能,限制60秒内只允许重新获取一次验证码。下面是JavaScript实现短信倒计时60s的攻略。 1. 倒计时基础框架 我们先来搭建倒计时的基本框架,HTML代码如下: <button id="btn">获取验证码</button> 需要注意的是,这里的…

    JavaScript 2023年5月27日
    00
  • javascript请求servlet实现ajax示例(分享)

    下面我来详细讲解“javascript请求servlet实现ajax示例(分享)”的完整攻略。 什么是 Ajax? Ajax 指的是一种创建交互式、快速动态网页的技术。利用 Ajax,在不重新加载整个页面的情况下,实现局部更新数据的功能,并且不会打断用户正在进行的操作。 实现 Ajax 的方式 实现 Ajax 的方式有很多,其中比较典型的方式就是使用 Jav…

    JavaScript 2023年6月11日
    00
  • 一起来学习一下JavaScript的事件流

    关于JavaScript事件流,我为大家准备了一份完整攻略,一起来学习一下。 什么是JavaScript事件流 JavaScript事件流是指浏览器中发生事件(如鼠标点击、键盘输入等)时,事件在DOM树结构中按照特定顺序发送和处理的过程。这个过程包含三个阶段:捕获阶段、目标阶段和冒泡阶段。 捕获阶段 在事件到达目标元素之前,从根节点到目标元素之间的所有节点都…

    JavaScript 2023年6月10日
    00
  • Vue项目全局配置微信分享思路详解

    “Vue项目全局配置微信分享思路详解”是一篇关于Vue项目中如何全局配置微信分享的攻略。下面我将详细讲解该攻略的完整思路和步骤。 标题 首先,我们需要在页面中引入微信的JS-SDK,获取微信的appid、noncestr、timestamp、signature等参数。在Vue项目中,通常使用axios进行网络请求,获取JS-SDK配置参数的代码如下所示: i…

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