JS的执行机制(EventLoop、宏任务和微任务)

JavaScript是一门单线程语言,即一次只能处理一件事情。但是,JavaScript中有很多异步处理机制。了解JavaScript中的执行机制(Event Loop、宏任务和微任务),对于理解异步处理机制,以及优化代码执行效率非常重要。

Event Loop

Event Loop是JavaScript中执行的机制,它是一个循环处理异步任务的过程。它会检查是否有需要执行的任务,以及这些任务是宏任务还是微任务,来安排何时执行它们。

每个Event Loop都有一个消息队列,用于存储待执行的宏任务和微任务。当事件被添加到队列时,Event Loop总是按照以下顺序处理队列中的任务:

  • 执行当前宏任务中的同步任务;
  • 执行微任务队列中的任务,直到队列为空;
  • 取出下一个宏任务并执行;
  • 回到2。

宏任务和微任务

宏任务是一些较大的任务,如setTimeout、setInterval、ajax等等。它们被添加到宏任务队列中,等待Event Loop处理。宏任务总是会在微任务之前执行。

微任务是一些较小的任务,如Promise的then和catch方法,MutationObserver等等。它们被添加到微任务队列中,等待Event Loop处理。微任务总是会在下一个宏任务之前执行。

由于宏任务的执行需要一定的时间,因此在一个宏任务中可能会产生多个微任务。当一个宏任务执行结束时,Event Loop会检查微任务队列,将队列中的所有任务依次执行,直到队列为空。然后Event Loop再从宏任务队列中取出下一个任务并执行。

示例

示例1

console.log('script start');

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

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

console.log('script end');

上述代码的执行过程如下:

  1. 执行console.log('script start'),输出 "script start"。
  2. 执行setTimeout(...)会将其添加到宏任务队列,等待下一次Event Loop执行时执行。
  3. 执行Promise.resolve(),会将其添加到微任务队列。
  4. 执行console.log('script end'),输出 "script end"。
  5. 当前宏任务执行结束,Event Loop会检查微任务队列,将其队列中的任务依次执行,即输出 "promise1" 和 "promise2"。
  6. 微任务队列为空,Event Loop将取出下一个宏任务,即执行setTimeout中的回调函数,输出 "setTimeout"。

最终输出结果为:

script start
script end
promise1
promise2
setTimeout

示例2

console.log('script start');

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

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

console.log('script end');

上述代码中,添加了一个额外的Promise任务。Promise.resolve()创建了一个新的微任务,它包含了另一个Promise.resolve(),这个Promise.resolve()又创建了一个新的微任务,即:Promise.resolve().then(...)

上述代码的执行过程如下:

  1. 执行console.log('script start'),输出 "script start"。
  2. 执行setTimeout(...),添加它到宏任务队列中,等待下一次Event Loop执行。
  3. 执行Promise.resolve(),添加它到微任务队列中。
  4. 执行console.log('script end'),输出 "script end"。
  5. 当前宏任务执行结束,Event Loop会检查微任务队列,发现queue中有一个微任务,输出 "promise1"。
  6. 执行queue中微任务的Promise.resolve(),在微任务队列中添加一个新的微任务。
  7. Event Loop检查微任务队列,发现微任务队列中有一个任务,执行它,输出 "promise2"。
  8. 微任务队列为空,Event Loop继续处理宏任务队列,执行setTimeout中的回调函数,输出 "setTimeout"。

最终输出结果为:

script start
script end
promise1
promise2
setTimeout

通过以上两个示例,我们可以更清晰地了解JavaScript的执行机制,Event Loop、宏任务和微任务的关系,对于理解JavaScript异步处理机制和代码效率优化非常有帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS的执行机制(EventLoop、宏任务和微任务) - Python技术站

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

相关文章

  • C#.Net ArrayList的使用方法

    下面给您讲解一下“C#.Net ArrayList的使用方法”的完整攻略。 1. 什么是ArrayList ArrayList是一种动态数组,它能够存储任意类型的元素,并且能够自动扩展容量。 2. 如何创建ArrayList 使用C#.Net 创建ArrayList的方式如下所示: ArrayList arrayList = new ArrayList();…

    JavaScript 2023年5月28日
    00
  • JavaScript函数及其prototype详解

    标题:JavaScript函数及其prototype详解 1. 函数基础知识 JavaScript中的函数是一等公民,也是最重要的核心语言特性之一。函数有以下定义形式: function functionName(arguments){ //函数体 return returnValue; } 其中,functionName是函数名,arguments是函数的…

    JavaScript 2023年5月18日
    00
  • 使用js修改客户端注册表的方法

    使用js修改客户端注册表的方法需要借助于ActiveXObject对象及其子对象WScript.Shell。具体方法如下: 创建WScript.Shell对象 需要先创建 WScript.Shell 对象,可以使用以下代码。 var WshShell = new ActiveXObject("WScript.Shell"); 使用 Wsh…

    JavaScript 2023年6月11日
    00
  • vue2模拟vue-element-admin手写角色权限的实现

    Vue2模拟Vue-element-admin手写角色权限的实现,可以通过以下步骤完成: 1. 安装依赖 首先需要安装以下依赖:Vue-Router(用于控制路由)、Axios(用于发送http请求),可使用如下命令: npm install vue-router axios 2. 构建基本页面布局 在Vue项目中创建相应的组件并进行基本页面布局,如Head…

    JavaScript 2023年6月11日
    00
  • JavaScript实现阿拉伯数字和中文数字互相转换

    讲解JavaScript实现阿拉伯数字和中文数字互相转换的完整攻略如下: 1. 阿拉伯数字转中文数字 1.1 前置知识 阿拉伯数字是我们常用的数字,0-9;而中文数字是汉字所表达的数字,例如:一、二、三、四、五等。 1.2 实现步骤 步骤如下: 定义一个数组numList,包含中文数字对应的字符串; const numList = [‘零’, ‘一’, ‘二…

    JavaScript 2023年5月28日
    00
  • JavaScript继承与多继承实例分析

    下面我将详细讲解“JavaScript继承与多继承实例分析”的完整攻略。 一、什么是JavaScript继承 继承是面向对象编程的重要概念之一。在JavaScript中,继承可以通过原型链来实现。原型链的基本思想是,每个JavaScript对象都有一个内部指针,指向它的原型对象。当我们试图访问一个对象的属性时,如果该对象自身不存在该属性,则会沿着原型链向上查…

    JavaScript 2023年6月10日
    00
  • javascript基础知识大集锦(二) 推荐收藏

    JavaScript基础知识大集锦(二) 推荐收藏 1. 为什么要学习JavaScript基础知识 JavaScript是网页开发的基础,无论是网页的交互动画设计还是后端的Node.js开发,都离不开JavaScript。因此,学习JavaScript基础知识是每个Web开发者必不可少的一步。 2. JavaScript基础知识大集锦(二)主要内容 本篇文章…

    JavaScript 2023年5月18日
    00
  • javascript操作表格

    下面是详细讲解”JavaScript操作表格”的完整攻略。 操作表格的基本方法 1.获取表格的节点 在JavaScript中,我们可以通过以下方式获取HTML中的表格节点: var table = document.getElementsByTagName(‘table’)[0]; //获取HTML中的第一个table标签 上述代码中,我们使用了getEle…

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