请你谈谈:从宏任务微任务的角度谈谈js代码的执行顺序

2024-08-25 19:36

本文主要是介绍请你谈谈:从宏任务微任务的角度谈谈js代码的执行顺序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

JavaScript(JS)在浏览器环境中确实是单线程的,这主要出于以下几个原因:

  • JavaScript 的主要作用之一是处理用户的交互,如点击按钮、填写表单等。如果JavaScript是多线程的,那么在处理这些事件时可能会出现竞态条件(race
    conditions),导致用户体验的不可预测性和不一致性。例如,如果两个线程同时尝试修改同一个DOM元素,那么最终的结果将是不可预测的。

我们可以将代码大致分为同步代码(同步任务)和异步代码(异步任务)来理解和处理JavaScript中的执行流程。

  • 同步代码:立即执行,阻塞后续代码,直到执行完成。
  • 异步代码:不立即执行,放入宿主环境的任务队列中,不阻塞主线程,异步结果在将来某个时间点成为可用,并触发相应的回调函数或Promise处理程序执行。

这种异步非阻塞的模型是JavaScript能够高效处理I/O密集型任务(如网络请求、文件读写等)的关键所在。

  • 同步代码是指按照代码书写顺序依次执行的代码。当JavaScript引擎(通常指的是V8、SpiderMonkey等JavaScript解释器)遇到同步代码时,它会立即执行这些代码,并且会“原地等待”直到这些代码执行完成。这里的“原地等待”意味着JavaScript引擎会阻塞后续代码的执行,直到当前同步代码块执行完毕。

    例如,当你执行一个循环或者调用一个函数时,如果这个函数内部不包含异步操作,那么它就是一个同步任务。同步任务会立即执行,并且在下一个任务执行之前,它会完全完成。

  • 异步代码的执行则与同步代码截然不同。当JavaScript引擎遇到异步代码时,它不会立即执行这些代码,而是会将异步操作(如定时器、网络请求、文件读写等)的回调函数或Promise等异步处理机制放入宿主环境(如浏览器或Node.js)的某个任务队列(如宏任务队列或微任务队列)中。然后,JavaScript引擎会继续执行后续的代码,而不会等待异步操作的结果。

    异步操作的结果会在将来的某个时间点成为可用,此时宿主环境会将其对应的回调函数或Promise解决(resolve)或拒绝(reject)的处理程序放入JavaScript引擎的执行栈中执行。这样,即使异步操作需要花费很长时间来完成,JavaScript引擎也不会被阻塞,可以继续处理其他任务。

在JavaScript中,异步任务确实被分为了宏任务(MacroTasks)和微任务(MicroTasks)两大类。

  • 并不是所有由JavaScript引擎发起的任务都是微任务。例如,setTimeoutsetInterval虽然是由JavaScript代码发起的,但它们是由宿主环境(浏览器或Node.js)管理的宏任务。
  • 不同的JavaScript引擎(如V8、SpiderMonkey等)和宿主环境(如不同版本的浏览器或Node.js)之间,在异步任务的处理上可能存在细微的差异。因此,在编写跨平台或跨版本的JavaScript代码时,需要注意这些差异。

宏任务是由宿主环境(如浏览器或Node.js)发起的异步任务。宏任务之间的执行是串行的,即每次只能执行一个宏任务,执行完毕后才会去执行下一个宏任务。它们通常包括:

  • script(整体代码)
  • setTimeout
  • setInterval
  • setImmediate(Node.js特有)
  • I/O
  • UI渲染
  • 事件处理(如点击、滚动等)

微任务是由JavaScript引擎发起的异步任务。与宏任务不同,微任务是在当前宏任务执行完毕后,下一个宏任务开始之前执行的。而且,微任务队列中的任务会按照它们被添加到队列中的顺序依次执行,直到微任务队列为空。它们通常包括:

  • Promise.thenPromise.catchPromise.finally
  • process.nextTick(Node.js特有)
  • MutationObserver(DOM变化观察)
  1. 从上往下执行所有的同步代码
  2. 在执行过程中遇到宏任务就存放到宏任务队列中, 遇到微任务就存放到微任务队列中
  3. 当所有的同步任务执行完毕, 就执行微任务队列中满足需求的所有回调(process.nextTick 优先 )
  4. 当微任务队列中所有满足需求的回调执行完毕后, 就执行宏任务队列中满足需求的所有回调 ( SetImmediate 最后 )
    在这里插入图片描述
1 3 4 5 1000 2

在这里插入图片描述
结果执行顺序为 : 3 2 1
在这里插入图片描述
在这里插入图片描述
输出结果为:11 14 12 15 13
在这里插入图片描述
输出结果为 :2 3 6 p2 p1 1 4 5

async function async1() {console.log('async1');await async2();console.log('async1 end');
}async function async2() {console.log('async2');
}console.log('script start');
setTimeout(function () {console.log('setTimeout');
}, 0);
async1();

在这里插入图片描述

script start
async1
async2
async1 end
setTimeout

这篇关于请你谈谈:从宏任务微任务的角度谈谈js代码的执行顺序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1106461

相关文章

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”