【面试题】宏任务和微任务

news2024/10/6 22:25:44

1. 宏任务和微任务

宏任务(macroTask)和微任务(microTask)都是异步中API的分类。

  • 宏任务:setTimeout,setInterval,Ajax,DOM事件
  • 微任务:Promise,async/await

微任务执行时机比宏任务要早。

 console.log(100)
 // 宏任务
 setTimeout(()=>{
     console.log(200)
 })
 // 微任务
 Promise.resolve().then(()=>{
     console.log(300)
 })
 console.log(400)

在这里插入图片描述

2. enevt loop和DOM渲染

JS是单线程的,而且和DOM渲染公用一个线程。JS执行的时候,需要留出时机用于DOM渲染。这个时机就是微任务执行后,宏任务执行前。

当Call Stack中的同步代码全部执行完毕之后,会进行DOM渲染,然后再触发event loop。
在这里插入图片描述
实例:当点击alert弹框的确认按钮后,才会渲染DOM元素,因为不点击确认按钮,Call Stack中的代码不会清空,就不会进行下一步:DOM渲染。

<body>
    <div id="container"></div>
    <script>
        
        const $p1 = $('<p>一段文字</p>')
        const $p2 = $('<p>一段文字</p>')
        const $p3 = $('<p>一段文字</p>')

        $('#container')
                    .append($p1)
                    .append($p2)
                    .append($p3)

        
        console.log('length', $('#container').children().length)
        alert('本次 call stack 结束,DOM 结构已更新,但尚未触发渲染')    // alert会阻断js执行,也会阻断DOM渲染
        
    </script>
</body>

3. 宏任务和微任务的根本区别

  • 宏任务:DOM渲染后触发,如setTimeout
  • 微任务:DOM渲染前触发,如Promise
<body>
    <div id="container"></div>
    <script>
        const $p1 = $('<p>一段文字</p>')
        const $p2 = $('<p>一段文字</p>')
        const $p3 = $('<p>一段文字</p>')

        $('#container')
            .append($p1)
            .append($p2)
            .append($p3)

        // 微任务:DOM渲染前触发
        Promise.resolve().then(()=>{
            console.log('lenght1', $('container').children().length)
            alert('触发了微任务')
        })

        // 宏任务:DOM渲染后触发
        setTimeout(()=>{
            console.log('lenght2', $('container').children().length)
            alert('触发了宏任务')
        })
    </script>
</body>

为什么微任务执行会更早?
  可以从event loop去理解。假如程序执行的时候遇到宏任务,例如setTimeout,此时会将setTimeout中执行的代码放入Web APIs中,等到所有的同步代码执行完,以及DOM元素渲染完毕之后,执行event loop,此时Web APIs中的代码等到了时机,会移动到Callback Queue中,event loopCallback Queue中的代码移到Call Stack中执行。
  然而,当Call Stack中遇到微任务时,例如Promise,此时会将Promise执行的代码放入micro task queue。因为Promise是ES6规定的,不是W3C规定的,因此执行时放入micro task queuemicro task queue的执行是先于DOM渲染的。微任务在DOM渲染前执行,宏任务在DOM渲染后执行,因此微任务的执行早于宏任务。
在这里插入图片描述

4. 实例

JS代码执行的顺序:

  1. 首先执行同步代码;
  2. 同步代码执行结束后,call stack被清空,开启envet loop;
  3. 执行微任务;
  4. 触发DOM元素渲染;
  5. 触发enevt loop;
  6. 执行宏任务。
async function async1(){
    console.log('async1 start')   // 顺序2
    await async2()
    console.log('async1 end')    // 顺序6
}

async function async2(){
    console.log('async2')      // 顺序3
}

console.log('script start')     // 顺序1

setTimeout(function(){
    console.log('setTimeout')   // 顺序8
}, 0)

async1()

// 初始化 promise 时,传入的函数会立刻被执行
new Promise(function(resolve){
    console.log('promise1')        // 顺序4
    resolve()
}).then(function(){
    console.log('promise2')    // 顺序7
})

console.log('script end')    // 顺序5

在这里插入图片描述

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

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

相关文章

策略 模式

策略模式 参考&#xff1a; 三种新姿势&#xff1a;帮你干掉过多的if-else (qq.com) http://t.csdn.cn/5YeOZ http://t.csdn.cn/HcGYw JAVASE中GUI编程中&#xff0c;布局管理 &#xff1b; Spring框架中&#xff0c;Resource接口&#xff0c;资源访问&#xff1b; javax.…

优美的曲线(含蝴蝶线)-CoCube

复现如下这篇&#xff1a; 优美的曲线-turtlesim 两段视频&#xff1a; 优美的曲线-CoCubebutterfly蝴蝶曲线之CoCube篇如何更深入分析&#xff0c;获得更高精度曲线呢&#xff1f; 对比下面两幅图&#xff1a; 尤其需要注意右图&#xff0c;右下角。 什么原因导致这个控制量…

一个元素纯CSS实现开关按钮【介绍box-shadow、单边或多重阴影、appearance属性】

借助checkbox表单元素、:checked伪类、::before/::after伪元素&#xff0c;就可以只需一个input[type"checkbox"]元素&#xff0c;通过纯CSS实现Switch开关效果的按钮。 主要用到的属性&#xff1a; appearance 默认css元素样式box-shadow 阴影效果transition css动…

ICG maleimide, ICG-MAL,2143933-81-5,ICG和PEG链接可在体内长循环.

英文名&#xff1a;ICG maleimide ICG-MAL CAS&#xff1a;2143933-81-5 分子式: C51H56N4O6S 分子量: 853.09 外 观&#xff1a;绿色粉末 溶解度&#xff1a;二氯甲烷 纯 度&#xff1a;95% 结构式&#xff1a; ICG is a tricarbocyanine-type dye with NIR-absorb…

Jenkins自动化测试Robot Framework详解

目录 1. Robot Framework 概念 2. Robot Framework 安装 3. Pycharm Robot Framework 环境搭建 4. Robot Framework 介绍 5. Jenkins 自动化测试 总结 重点&#xff1a;配套学习资料和视频教学 1. Robot Framework 概念 Robot Framework是一个基于Python的&#xff0c;…

MySQL——怎么给字符串字段加索引

现在&#xff0c;几乎所有的系统都支持邮箱登录&#xff0c;如何在邮箱这样的字段上建立合理的索引&#xff0c;是本篇文章要讨论的问题。 假设&#xff0c;现在维护一个支持邮箱登录的系统&#xff0c;用户表是这么定义的&#xff1a; mysql> create table SUser( ID big…

Hive 分析银行转账风险

文章目录创建数据源基于转账记录&#xff0c;计算 7 天内各个账号的转账金额找出相同收付款人 5 天内连续转账3次或以上的记录创建数据源 数据来源&#xff1a;数据源 drop table transfer_log;CREATE TABLE transfer_log ( log_id bigint, -- idlog_ts timestamp, -- 操作时…

128-152-spark-核心编程-源码

128-spark-核心编程-源码&#xff08;主要以了解基本原理和流程为主&#xff09;&#xff1a; 总体相关 ​ 1.环境准备(Yarn 集群) ​ (1) Driver, Executor ​ 2.组件通信 ​ (1) Driver > Executor ​ (2) Executor > Driver ​ (3) Executor > Executor ​ 3.应用…

Unity异步加载AB包

Unity异步加载AB包写在前面效果关键讲解项目地址写在后面写在前面 最近项目需要在Unity中完成一个非常耗时的工作&#xff0c;所以学习了下异步加载的流程&#xff0c;这里做了一个demo&#xff0c;异步加载AB包&#xff0c;其实异步加载场景等&#xff0c;原理差不多。 效果…

Tomcat的Maven插件使用方法(在idea里面运行Tomcat)

目录 一、概述 二、下载和导入插件 三、测试使用方式 四、总结 一、概述 使用这个插件可以快速的运行Tomcat&#xff0c;比在本地配置快得多。 二、下载和导入插件 1.下载插件Maven Helper ps&#xff1a;已经有下载过这个插件的可以跳过此步骤 &#xff08;1&#xff…

一、导论——可解释性机器学习(DataWhale组队学习)

目录导言一、什么是可解释人工智能?二、学可解释机器学习有什么用?2.1学习可解释机器学习的原因2.2 Machine Teaching :人工智能教人类学习2.3 细粒度图像分类2.4前沿AI三、本身可解释性好的机器学习模型四、传统机器学习算法的可解释性分析五、卷积神经网络的可解释性分析5.…

前端基础(二)_HTML常用标签(块级标签、行级标签、行块级标签)

HTML常用标签 我们可以分为三类&#xff1a; 1.块级标签 2.行级标签 3.行块级标签 一、块级标签 1.1 h系类标签 标题标签 H1~h6 大到小 H1 在同一个页面中只能使用一次 其他标签可以重复 特点&#xff1a;默认宽度100% 高度自适应 独立成行 自带间距加粗 <body><…

java计算机毕业设计ssm制造型企业仓储管理系统i0180(附源码、数据库)

java计算机毕业设计ssm制造型企业仓储管理系统i0180&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&…

[附源码]计算机毕业设计的项目管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

基于小波变换的图像压缩解压缩的matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 图像压缩的类别 对于图像压缩&#xff0c;主要有两类方法&#xff1a;无损的图像压缩以及有损的图像压缩&#xff0c;分别称为lossless image compression and lossy image compression。 对于无…

[附源码]Node.js计算机毕业设计动漫网站Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

第37篇 网络(七)TCP(一)

导语 TCP即TransmissionControl Protocol&#xff0c;传输控制协议。与UDP不同&#xff0c;它是面向连接和数据流的可靠传输协议。也就是说&#xff0c;它能使一台计算机上的数据无差错的发往网络上的其他计算机&#xff0c;所以当要传输大量数据时&#xff0c;我们选用TCP协议…

ssm+Vue计算机毕业设计校园生活服务预约管理系统(程序+LW文档)

ssmVue计算机毕业设计校园生活服务预约管理系统&#xff08;程序LW文档&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;…

spring切入点表达式(一)

前面写到切入点表达式&#xff0c;如果把全部方法都作为切入点的话&#xff0c;用execution(* *(..))表达式&#xff0c;这个表达式代表什么意思呢&#xff1f; public void login (String name,String address){} * * ( . . ) * *(..)对应方法如上图 * -------->代表修…

【GRU回归预测】基于鲸鱼算法优化门控循环单元WOA-GRU神经网络实现多输入单输出回归预测附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …