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日

相关文章

  • JavaScript 学习笔记二 字符串拼接

    JavaScript 学习笔记二 字符串拼接 在JavaScript中,字符串拼接是非常常见的操作。这篇笔记将重点探讨JavaScript中字符串拼接的几种方法。 1. 使用“+”符号 在JavaScript中,我们可以使用“+”符号将两个字符串拼接在一起。例如: var str1 = "Hello"; var str2 = "…

    JavaScript 2023年5月28日
    00
  • Chart.js功能与使用方法小结

    Chart.js功能与使用方法小结 什么是Chart.js Chart.js是一款简单灵活的JavaScript图表库,可以用于绘制各种类型的图表,包括线图、柱状图、雷达图、饼图等等。Chart.js基于HTML5的Canvas元素实现,具有良好的兼容性和性能优势。 安装与引入 在使用Chart.js之前,需要先进行安装和引入。可以通过以下方式进行安装: n…

    JavaScript 2023年6月11日
    00
  • js获得参数的getParameter使用示例

    当我们开发一个需要传参的JavaScript网页时,经常需要从URL中获取传递的参数。而getParameter就是一种常用的JS函数来用于获取参数值的方法。 下面是getParameter的具体使用方法及示例说明: 1. getParameter使用方法 getParameter的基本使用方法是:获取URL参数的值使用“?”作为分隔符,不同的参数之间用“&…

    JavaScript 2023年6月11日
    00
  • javascript数组去重方法汇总

    JavaScript数组去重方法汇总 在JavaScript中,数组是一种非常重要的数据类型,经常在实际的开发中用来存储一系列数据。但是,有时候我们需要对数组进行去重操作,即只保留数组中的不重复元素。本文将介绍几种常用的JavaScript数组去重方法。 1.使用Set对象 使用ES6中新增的Set对象可以非常方便地对数组进行去重。Set对象中的所有元素都是…

    JavaScript 2023年5月27日
    00
  • JavaScript操作选择对象的简单实例

    下面我将为您详细讲解“JavaScript操作选择对象的简单实例”的完整攻略。 1. 选择对象 要操作 HTML 中的元素,我们必须首先找到它。找到元素的最常用方法是使用 id 属性。我们可以使用 document.getElementById() 方法来选择一个有 id 的元素。 比如,我们有如下HTML代码: <div id="demo&…

    JavaScript 2023年5月27日
    00
  • 归纳下js面向对象的几种常见写法总结

    针对“归纳下js面向对象的几种常见写法总结”的完整攻略,我给出如下的详细讲解: 1. 面向对象编程 面向对象编程(OOP,Object Oriented Programming)是一种编程范式,它将任务分解成一些个体,这些个体通过彼此分工协作来完成任务。在 JavaScript 中,对象、构造函数、原型链和继承都是实现 OOP 的关键元素。 2. JS面向对…

    JavaScript 2023年5月27日
    00
  • 关于JavaScript中URL对象的一些妙用

    关于JavaScript中URL对象的一些妙用,我来为大家详细讲解一下。 什么是URL对象 URL对象是JavaScript中的一个内置对象,它表示一个统一资源定位符,即URL。它可以帮助我们解析并操作URL。 在JavaScript中,我们可以通过创建一个URL实例来创建一个URL对象。其语法如下: let urlObject = new URL(urlS…

    JavaScript 2023年6月11日
    00
  • JavaScript对JSON数据进行排序和搜索

    下面是关于JavaScript对JSON数据进行排序和搜索的完整攻略: 排序 要对JSON数据进行排序,可以先将其转换为数组,然后使用sort()方法进行排序。以下是具体的步骤: 将JSON数据解析为JavaScript对象。 let data = ‘{"name": "Alice", "age":…

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