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

yizhihongxing

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日

相关文章

  • 微信小程序引入Vant组件库过程解析

    下面是详细讲解如何在微信小程序中引入Vant组件库。 1. 确认小程序的基础库版本号 Vant组件库的版本以及对应的基础库版本可以在Vant官方文档中查看,确保你的小程序基础库版本符合要求。如果不符合要求,需要升级基础库版本。升级基础库版本需要注意,有可能会导致之前代码的兼容性问题,所以需要谨慎操作。 2. 在小程序项目中安装Vant组件库并引入 可以通过n…

    JavaScript 2023年6月11日
    00
  • JavaScript自定义日期格式化函数详细解析

    JavaScript自定义日期格式化函数详细解析 在JavaScript中,日期是一个非常常见的数据类型。在处理日期时,我们通常需要对日期的格式进行调整,以便更好地展示给用户。为此,我们可以使用JavaScript自带的日期格式化函数toLocaleString()等来格式化日期,但是这些函数的格式选项非常有限,不够灵活。因此,本文将介绍如何自定义JavaS…

    JavaScript 2023年5月27日
    00
  • 实例讲解使用原生JavaScript处理AJAX请求的方法

    处理AJAX请求是现代Web开发中非常重要的一部分,可以轻松地从服务器加载数据并进行无需刷新页面的动态更新。原生JavaScript提供了一些内置的方法,可用于处理AJAX请求,并通过JavaScript代码与其他服务端技术交互。 以下是使用原生JavaScript处理AJAX请求的方法的完整攻略: 步骤一:创建XMLHttpRequest对象 XMLHtt…

    JavaScript 2023年6月11日
    00
  • vue+element实现表单校验功能

    下面是“vue+element实现表单校验功能”的完整攻略。 一、需求 在前端开发中,表单校验是一项常见的需求。我们需要实现以下功能: 用户填写表单时,对表单数据进行即时校验,及时提示用户。 当用户提交表单数据时,对数据再次校验,确保数据填写正确后才提交。 为了实现上述两个功能,我们可以选择使用Vue框架和Element组件库提供的表单组件及表单校验功能。下…

    JavaScript 2023年6月10日
    00
  • 详解vue-socket.io使用教程与踩坑记录

    详解vue-socket.io使用教程与踩坑记录 什么是vue-socket.io Vue-socket.io是一个适用于Vue.js的Socket.io插件,使得在Vue.js中使用Socket.io变得非常简单。 安装和使用 安装 在你的项目中,通过npm安装vue-socket.io npm install vue-socket.io –save 引…

    JavaScript 2023年6月11日
    00
  • Google 爬虫如何抓取 JavaScript 的内容

    当Google爬虫(Googlebot)抓取网站时,它可以执行JavaScript并抓取动态生成的内容。然而,有些情况下担心Googlebot无法正确地执行JavaScript。在这里,我们详细讲解如何让Google爬虫成功抓取JavaScript内容。 确保JavaScript没有错误 Googlebot可以执行JavaScript并抓取动态生成的内容,但…

    JavaScript 2023年5月27日
    00
  • js关于精确计算和数值格式化以及直接引js文件

    JavaScript是一种基于浮点数的编程语言,在处理整数和小数时可能会出现精度问题。因此,正确的数值计算和格式化对于JavaScript是非常重要的。在本攻略中,我们将讨论JS中的精确计算和数值格式化,并展示如何引用外部JS文件。 精确计算 在JS中,对于小数计算,我们一般使用toFixed()函数进行保留位数的操作。但是,toFixed()函数在计算时可…

    JavaScript 2023年5月27日
    00
  • ES6中new Function()语法及应用实例分析

    首先我们先来了解一下ES6中的new Function()语法。 ES6中new Function()语法 在ES6之前,我们通常使用以下方式来创建一个函数: function sum(a, b) { return a + b; } 在ES6中,我们可以使用new Function()语法来创建函数,如下所示: const sum = new Functio…

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