理解宏任务和微任务:JavaScript 异步编程的必备知识(上)

在这里插入图片描述

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6
🍨 阿珊和她的猫_CSDN个人主页
🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》
🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

  • 1. 引言
    • 介绍宏任务和微任务的概念及作用
  • 2. 宏任务和微任务的区别和联系
    • 对比两者的区别和联系
  • 3. 宏任务和微任务的执行顺序
    • 阐述宏任务和微任务在事件循环中的执行顺序
    • 以示例说明不同类型任务的执行顺序

1. 引言

介绍宏任务和微任务的概念及作用

一、宏任务(Macro Task)

宏任务是指在 JavaScript 中需要等待整个脚本执行完毕后才会执行的任务。常见的宏任务包括:

  1. script(脚本):执行 JavaScript 代码。
  2. setTimeout 和 setInterval:用于设置延迟或定时执行的函数。
  3. I/O 操作:如文件读取、网络请求等。
  4. UI 渲染:浏览器重新渲染页面。

在这里插入图片描述

宏任务的作用是处理一些需要在整个脚本执行完毕后进行的操作,例如在页面加载完成后执行一些初始化代码、在用户操作后进行数据处理等。

二、微任务(Micro Task)

微任务是指在 JavaScript 中可以在当前任务执行完毕后立即执行的任务。常见的微任务包括:

  1. Promise 的回调函数:当 Promise 对象状态改变时(如 resolve 或 reject),注册的回调函数会被添加到微任务队列中。
  2. MutationObserver:用于监视 DOM 树的变化。
  3. Async/Await:异步函数的回调函数会被添加到微任务队列中。

在这里插入图片描述

微任务的作用是处理一些需要在当前任务执行完毕后立即执行的操作,例如在异步操作完成后进行后续处理、在用户操作后立即更新页面等。

宏任务和微任务的执行顺序是:先执行宏任务队列中的任务,当宏任务队列中的任务全部执行完毕后,再执行微任务队列中的任务。这种执行顺序确保了 JavaScript 代码的顺序执行,同时也提供了一种异步处理的方式。

2. 宏任务和微任务的区别和联系

对比两者的区别和联系

宏任务和微任务是 JavaScript 中的两个概念,它们在执行顺序和执行时机上有所不同。

  • 宏任务(Macro Task):宏任务是指需要等待当前 JavaScript 事件循环结束后才能执行的任务。常见的宏任务包括:setTimeout()setInterval()XMLHttpRequest 的回调函数、I/O 操作 等。宏任务会被放入事件队列中,等待当前事件循环的所有任务执行完毕后,才会按照事件队列中的顺序依次执行。

  • 微任务(Micro Task):微任务是指可以在当前 JavaScript 事件循环中立即执行的任务。常见的微任务包括:Promise 的回调函数、MutationObserver 的回调函数等。微任务会被放入微任务队列中,在当前事件循环的所有任务执行完毕后,会优先执行微任务队列中的任务,然后再执行事件队列中的宏任务。

宏任务和微任务的联系在于,它们都是 JavaScript 事件循环中的任务,都会按照一定的顺序执行。在执行顺序上,微任务会优先于宏任务执行。这意味着,如果在一个宏任务中创建了一个微任务,那么这个微任务会在当前事件循环中立即执行,而不会等待宏任务执行完毕。

3. 宏任务和微任务的执行顺序

阐述宏任务和微任务在事件循环中的执行顺序

宏任务和微任务在事件循环中的执行顺序如下:

  1. 执行当前事件循环中的所有宏任务。
  2. 检查微任务队列,如果有微任务,则执行微任务队列中的所有微任务。
  3. 如果有新的宏任务被添加到事件队列中,则回到步骤 1。

以示例说明不同类型任务的执行顺序

以下是一个简单的示例来说明不同类型任务的执行顺序:

console.log('start');setTimeout(() => {console.log('timeout');
}, 0);Promise.resolve().then(() => {console.log('promise');
});console.log('end');

在这个示例中,有三个任务:

  • console.log('start'):这是一个宏任务,会在当前事件循环中立即执行。
  • setTimeout(() => {console.log('timeout')}, 0):这是一个宏任务,它会被放入事件队列中,等待当前事件循环结束后执行。
  • Promise.resolve().then(() => {console.log('promise')}):这是一个微任务,它会被放入微任务队列中,在当前事件循环的所有任务执行完毕后立即执行。

因此,这个示例的输出结果是:

start
end
promise
timeout

可以看到,微任务 promise 先于宏任务 timeout 执行。这是因为微任务会在当前事件循环的所有任务执行完毕后立即执行,而宏任务需要等待当前事件循环结束后才能执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/193002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

教你5步学会用Llama2:我见过最简单的大模型教学

在这篇博客中,Meta 探讨了使用 Llama 2 的五个步骤,以便使用者在自己的项目中充分利用 Llama 2 的优势。同时详细介绍 Llama 2 的关键概念、设置方法、可用资源,并提供一步步设置和运行 Llama 2 的流程。 Meta 开源的 Llama 2 包括模型权重和…

Java开发项目之KTV点歌系统设计和实现

项目介绍 本系统实现KTV点歌管理的信息化,可以方便管理员进行更加方便快捷的管理。系统的主要使用者分为管理员和普通用户。 管理员功能模块: 个人中心、用户管理、歌曲库管理、歌曲类型管理、点歌信息管理。 普通用户功能模块: 个人中心…

一、CSharp_Basic:什么是.Net平台?什么是.Net FrameWork?什么是C#?

什么是.Net平台? 在了解C#之前,我们应该先了解一下什么是.Net平台。 .Net的诞生 2000年,这时候的微软凭借其Windows操作系统庞大的用户基数,推出了.Net1.0的标准。 也就是实现在Windows平台上面开发和应用程序的概念。我们可以简…

P3 Linux应用编程:系统调用与库函数

前言 🎬 个人主页:ChenPi 🐻推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ 🔥 推荐专栏2: 《Linux C应用编程(概念类)_ChenPi的博客-CSDN博客》✨✨✨ 🛸推荐专栏3: ​​​​​​《 链表_Chen…

BUUCTF [RoarCTF2019]黄金6年 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 得到的 flag 请包上 flag{} 提交。 密文: 下载附件,得到.mp4文件。 attachment 解题思路: 1、浅浅的看了一遍,没发现什么有用的内容。放到Kinovea中,慢倍…

通用plantuml模板头

通用plantuml文件 startuml participant Admin order 0 #87CEFA // 参与者、顺序、颜色 participant Student order 1 #87CEFA participant Teacher order 2 #87CEFA participant TestPlayer order 3 #87CEFA participant Class order 4 #87CEFA participant Subject order …

轻量封装WebGPU渲染系统示例<42>- vsm阴影实现过程(源码)

前向实时渲染vsm阴影实现的主要步骤: 1. 编码深度数据,存到一个rtt中。 2. 纵向和横向执行遮挡信息blur filter sampling, 存到对应的rtt中。 3. 将上一步的结果(rtt)应用到可接收阴影的材质中。 具体代码情况文章最后附上的实现源码。 当前示例源码github地址: …

react native 环境准备

一、必备安装 1、安装node 注意 Node 的版本应大于等于 16,安装完 Node 后建议设置 npm 镜像(淘宝源)以加速后面的过程(或使用科学上网工具)。 node下载地址:Download | Node.js设置淘宝源 npm config s…

GEE:梯度卷积

作者:CSDN @ _养乐多_ 本文将介绍在 Google Earth Engine(GEE)平台上,进行梯度卷积操作的代码框架、核心函数和多种卷积核,比如 Roberts、Prewitt、Sobel、各向同性算子、Compass算子、拉普拉斯算子、不同方向线性检测算子等。 结果如下图所示, 文章目录 一、常用的梯度…

数学建模之典型相关分析

发现新天地,欢迎访问 介绍 典型相关分析(Canonical Correlation analysis)研究两组变量(每组变量中都可能有多个指标)之间相关关系的一种多元统计方法。它能够揭示出两组变量之间的内在联系。 例子 我们要探究观众和业内人士对…

非应届生简历模板13篇

无论您是职场新人还是转行求职者,一份出色的简历都是获得心仪岗位的关键。本文为大家精选了13篇专业的非应届生简历模板,无论您的经验如何,都可以灵活参考借鉴,提升自己的简历质量。让简历脱颖而出,轻松斩获心仪职位&a…

16.字符串处理函数——字符串长度函数

文章目录 前言一、题目描述 二、解题 程序运行代码 总结 前言 本系列为字符串处理函数编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 二、解题 程序运行代码 #include<stdio.h> #include<string.h> int main() {char str[ ]"0123\0456…

mac安装解压缩rar后缀文件踩坑

mac默认能够解压缩zip后缀的文件&#xff0c;如果是rar后缀的自己需要下载相关的工具解压 下载地址&#xff1a; https://www.rarlab.com/download.htm mac我是因特尔芯片所以下载 x64 然后解压缩文件进入目录 rar中 将可执行文件 rar、unrar 移动到 /usr/local/bin目录下即…

[架构之路-254]:目标系统 - 设计方法 - 软件工程 - 软件设计 - 架构设计 - 全程概述

目录 一、软件架构概述 1.1 什么是软件架构 1.2 为什么需要软件架构设计 1.3 软件架构设计在软件设计中位置 &#xff08;1&#xff09;软件架构设计&#xff08;层次划分、模块划分、职责分工&#xff09;&#xff1a; &#xff08;2&#xff09;软件高层设计、概要设计…

精准长尾关键词批量挖掘工具,长尾关键词挖掘正确使用方法

互联网时代&#xff0c;SEO已然成为网站推广的关键一环。而在SEO的世界里&#xff0c;长尾关键词无疑是一块被广泛忽视却蕴含着巨大潜力的宝地。 什么是长尾关键词 长尾关键词&#xff0c;指的是那些相对不那么热门、搜索量较低但更为具体、更贴近用户真实需求的关键词。与短…

VR 实现 Splash Screen 效果

文章目录 背景官方实现逆向分析 背景 手机 App 在实现 Splash Screen 的时候&#xff0c;目前都有成熟的方案可以参考&#xff0c;但是在做 VR 开发时&#xff0c;要如何实现一个 App 自己的 Splash Screen &#xff0c;下面是我们基于 PICO & OCULUS 进行业务开发时经过探…

Linux:dockerfile编写搭建nginx练习(8)

dockerfile是创建镜像的一种&#xff0c;通过已有镜像的基础上再在上面部署一些别的。 在这个基础镜像上搭建&#xff0c;我这个是一个空的centos镜像 我这里用http的yum仓库存放了nginx和rpm包 创建dockerfile vim Dockerfile写入#设置基础镜像 FROM centos#维护该镜像的用户…

掌握视频剪辑技巧,轻松自定义视频速率,打造个性化出彩视频

你是否曾经因为视频节奏平淡而缺乏吸引力而苦恼&#xff1f;现在&#xff0c;我们为你推荐一款视频批量剪辑工具&#xff0c;让你轻松自定义视频速率&#xff0c;实现出彩个性化视频。 首先第一步&#xff0c;我们要打开好简单批量智剪&#xff0c;并登录账号。 第二步&#x…

从0开始学习JavaScript--JavaScript 箭头函数

JavaScript的现代语法&#xff0c;箭头函数&#xff08;Arrow Functions&#xff09;是一个不可忽视的重要部分。它们不仅提供了更简洁的语法&#xff0c;还改变了函数的作用域规则。在这篇文章中&#xff0c;将深入研究JavaScript箭头函数的概念、语法、用法以及它们与传统函数…

sourceTree的下载和安装

sourceTree的下载和安装 一、概述 SourceTree 是一款免费的 Git 和 Hg 客户端管理工具&#xff0c;支持 Git 项目的创建、克隆、提交、push、pull 和合并等操作。它拥有一个精美简洁的界面&#xff0c;大大简化了开发者与代码库之间的 Git 操作方式&#xff0c;这对于不熟悉 …