JS前端宏任务微任务及Event Loop使用详解

JS前端宏任务、微任务及Event Loop使用详解

在JavaScript中,我们经常听到宏任务(Macro Task)、微任务(Micro Task)和Event Loop的概念。本文将详细讲解这些概念,以及它们在JavaScript中的使用。

1. 前置知识

在开始讲解之前,我们需要了解一些前置知识:

  • JavaScript是单线程的,意味着任务只能一次执行一个任务。
  • 由于JavaScript是单线程的,如果某个任务阻塞了线程,其他任务将无法执行,因此我们需要一种机制来管理异步任务。
  • 任务可以分为两种:宏任务和微任务。

2. 宏任务和微任务

宏任务和微任务是两种不同类型的任务,它们的执行顺序是不同的。

2.1. 宏任务

宏任务(Macro Task)是指在当前任务队列中被调度的任务。例如:

  • DOM事件处理
  • setTimeout
  • setInterval
  • setImmediate(nodejs独有)
  • requestAnimationFrame(浏览器独有)
  • I/O操作(nodejs独有)

2.2. 微任务

微任务(Micro Task)是指在当前任务执行结束后需要立即执行的任务。例如:

  • Promise.then
  • Promise.catch
  • Promise.finally
  • MutationObserver
  • process.nextTick(nodejs独有)
  • Object.observe(已废弃)

3. Event Loop

Event Loop 翻译为事件循环,是JavaScript的一种执行机制。

Event Loop 有一个很重要的概念:任务队列(Task Queue),即宏任务和微任务的队列。

Event Loop的执行过程如下:

  1. 执行全局Script同步代码,这些同步代码可能会产生宏任务或者微任务。
  2. 执行所有微任务,直到微任务队列为空。
  3. 取出一个宏任务执行,执行过程中产生的微任务会加入微任务队列。
  4. 重复步骤2-3,直到所有任务都执行完毕。

4. 示例说明

4.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');

输出结果:

script start
script end
promise1
promise2
setTimeout

解释:

  1. console.log('script start')console.log('script end')是同步代码,直接输出。
  2. setTimeout是一个宏任务,将它加入宏任务队列中。
  3. Promise.resolve().then()是两个微任务,将它们加入微任务队列中。
  4. 当Script执行完毕时,JavaScript会立刻执行所有微任务。因此,先输出promise1,然后输出promise2
  5. 当微任务执行完毕时,JavaScript会取出一个宏任务(如果有的话)执行,因此,最后输出setTimeout

4.2. 示例二

console.log('script start');

setTimeout(function() {
  console.log('setTimeout');
  Promise.resolve().then(function() {
    console.log('promise');
  });
}, 0);

console.log('script end');

输出结果:

script start
script end
setTimeout
promise

解释:

  1. console.log('script start')console.log('script end')是同步代码,直接输出。
  2. setTimeout是一个宏任务,将它加入宏任务队列中。
  3. setTimeout的回调函数中,又产生了一个微任务Promise.resolve().then(),将它加入微任务队列中。
  4. 当Script执行完毕时,JavaScript会立刻执行所有微任务。因此,先输出promise
  5. 当微任务执行完毕时,JavaScript会取出一个宏任务(如果有的话)执行,因此,最后输出setTimeout

5. 总结

本文详细讲解了JavaScript中的宏任务、微任务和Event Loop。在编写JavaScript代码时,需要注意代码的执行顺序,合理使用宏任务和微任务可以有效地提高代码的性能。

我们需要避免在主线程中执行过多的任务,例如长时间的循环、大量的DOM操作等,这些任务会阻塞主线程,导致页面变得卡顿,影响用户体验。因此,我们需要将这些任务放到宏任务队列中或者使用异步的方式进行执行。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS前端宏任务微任务及Event Loop使用详解 - Python技术站

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

相关文章

  • JS实现自定义状态栏动画文字效果示例

    下面是JS实现自定义状态栏动画文字效果示例的完整攻略: 1. 准备工作 首先,在HTML文件中添加一个空的div标签作为状态栏: <div id="status-bar"></div> 然后,在CSS文件中对状态栏进行样式设置,例如设置宽度、高度、边框、背景色等。为了实现动画效果,我们还需要设置状态栏为相对定位(p…

    JavaScript 2023年6月10日
    00
  • JavaScript 参数中的数组展开 [译]

    文章“JavaScript 参数中的数组展开 [译]”介绍了JavaScript的一个很有用的语法特性:展开运算符(spread operator)。在函数参数中使用展开运算符可以方便地将数组或对象中的内容“展开”成独立的元素,方便使用。本文将对这一语法进行详细讲解。 什么是展开运算符? 展开运算符用符号“…”表示,它可以将一个数组或者类数组对象中的所有…

    JavaScript 2023年5月27日
    00
  • JS实现给对象动态添加属性的方法

    给对象动态添加属性的方法在JS中有多种实现方式,下面详细讲解其中较为常见的两种。 使用点操作符或方括号操作符 我们可以使用点操作符或方括号操作符在运行时动态地为对象添加属性。使用点操作符时,可以像如下代码一样,将属性名称作为对象的属性名: const obj = {}; obj.name = ‘张三’; console.log(obj.name); // 输…

    JavaScript 2023年5月27日
    00
  • JavaScript中解析JSON数据的三种方法

    JavaScript中解析JSON数据的三种方法涉及到解析JSON的格式,这里我们假设需要解析的JSON数据为以下格式: { "name": "John Doe", "age": 30, "isAdmin": true, "hobbies": [ "…

    JavaScript 2023年5月27日
    00
  • Element的el-tree控件后台数据结构的生成以及方法的抽取

    生成后台数据结构: 首先,我们需要明确el-tree控件所需要的数据格式,它要求数据使用树形结构进行展示,每一项数据包含以下属性: label:节点描述 children:子节点数据,是一个数组,也可以为空 接着,我们需要对后台的原始数据进行格式化处理,使其可以被el-tree控件所展示。常见的处理方式是使用递归的方式将原始数据转换为树形结构,具体过程如下:…

    JavaScript 2023年6月10日
    00
  • JavaScript深入理解作用域链与闭包详情

    JavaScript深入理解作用域链与闭包攻略 作用域链 在JavaScript中,作用域链是一种机制,它决定了变量和函数的访问权限。每个函数都有一个作用域链,它是由函数创建时所处的环境和所有父级环境的变量对象所组成。当函数执行时,它的作用域链会被用来解析变量和函数的引用。 示例一:作用域链的基本概念 var globalVar = ‘global’; fu…

    JavaScript 2023年6月10日
    00
  • 详解Three.js 场景中如何彻底删除模型和性能优化

    针对“详解Three.js场景中如何彻底删除模型和性能优化”的完整攻略,以下是详细的讲解。 第一部分:如何彻底删除模型 在Three.js场景中,我们创建了许多的对象,例如模型、灯光、相机等。如果某些模型不再需要使用了,就应该将这些模型从场景中彻底删除,以释放内存并提高性能 1.1 单个模型的删除 要删除单个模型,需要使用以下代码: scene.remove…

    JavaScript 2023年6月10日
    00
  • 原生javascript实现图片轮播切换效果

    下面进入主题,讲解如何用原生 JavaScript 实现图片轮播切换效果。 准备 在开始实现之前,我们需要先准备好以下内容: 图片资源 一个用于显示轮播图片的HTML元素 CSS样式 JavaScript代码 HTML 我们先来看一下 HTML 部分的代码。我们需要一个 div 元素作为图片轮播的容器,用于显示待切换的图片。 <div id=&quot…

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