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实现将数组中所有元素连接成一个字符串的方法

    实现将数组中所有元素连接成一个字符串的方法有以下两种: 方法一:Array.prototype.join() JavaScript中可以使用Array.prototype.join()函数将数组中的所有元素连接成一个字符串。 使用格式:Array.join(separator) 参数说明:- separator:可选参数,指定分隔符,将数组中的元素连接成字符…

    JavaScript 2023年5月28日
    00
  • Django操作cookie的实现

    下面是关于Django操作cookie的实现的完整攻略。 什么是Cookie Cookie是一段很小的文本信息,由网站发送到访问者的浏览器中,并在之后的访问中由浏览器向服务器发送。Cookie通常用于存储用户的偏好设置、登录状态、购物车信息等。 Django中创建和读取Cookie Django使用HttpRequest对象来操作Cookie。其中,创建Co…

    JavaScript 2023年6月11日
    00
  • JavaScript函数之call、apply以及bind方法案例详解

    JavaScript函数之call、apply以及bind方法案例详解 本文将详细介绍JavaScript中的函数三大方法:call、apply、bind。它们用于改变函数内部this指向的对象,并且可以传递一些参数,方便我们灵活地调用函数。在本文中,我们将一步一步的讲解这三个函数的使用方法,并通过多个示例来详细说明其使用场景与细节问题。 call() 方法…

    JavaScript 2023年6月11日
    00
  • Ajax原理与应用案例快速入门教程

    Ajax原理与应用案例快速入门教程攻略 什么是Ajax? Ajax 指的是“Asynchronous Javascript And XML” (异步 JavaScript 和 XML)。 通过在后台与服务器进行少量数据交换,实现网页异步更新。这意味着可以在不重新加载整个网页的情况下更新网页的部分内容。 Ajax的原理 Ajax的工作原理相对简单,基本由以下几…

    JavaScript 2023年6月11日
    00
  • JavaScript统计字符出现次数

    想要实现统计 JavaScript 字符出现次数的效果,可以按照以下步骤进行。 步骤一 – 准备 在 JavaScript 中,我们需要准备一定的数据,才可以进行字符统计,常见的准备数据包括: 字符串:需要统计字符的字符串。 字典:用于存储每个字符出现的次数。 以下是示例代码: const str = ‘Hello, World!’; const dict …

    JavaScript 2023年5月28日
    00
  • js中将多个语句写成一个语句的两种方法小结

    下面是详细讲解如何将多个JavaScript语句合并成一个语句的两种方法,帮助大家掌握并使用起来。 方法一:使用分号连接多个语句 我们在JavaScript中常常需要写多个语句,比如: let a = 1; let b = 2; let c = a + b; console.log(c); 这段代码包含了三个语句,我们可以将它们合并成一个语句,如下: let…

    JavaScript 2023年6月11日
    00
  • JS解析json数据并将json字符串转化为数组的实现方法

    我来为你提供一份完整的攻略。 1. JSON和数组的简介 在介绍解析JSON数据并将JSON字符串转换为数组的实现方法之前,我们先来简单了解一下JSON和数组。 JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,具有简洁、易于读写的特点。JSON的数据格式是键值对的方式,键和值都使用双引号包裹,键值对之间使…

    JavaScript 2023年5月27日
    00
  • 基于JS实现点击图片在弹出层显示大图效果

    实现点击图片在弹出层显示大图是一种常见的前端页面交互效果,可以提高网站的用户体验度和可用性,下面我将为你讲解实现这个效果的方法和步骤,包括HTML、CSS和JavaScript的代码实现。 首先,在HTML中需要做如下准备: 编写HTML结构,包含要展示的图片和弹出层: “`html “` 在CSS中设置弹出层和其内容的样式: “`css .modal…

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