前端宏任务与微任务解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 前端宏任务与微任务解析

宏任务
(1)分类 : setTimeout () setInterval () requestAnimationFrame () I/O
(2)特点 :

1.宏任务所处的队列即为宏任务队列。
2.第一个宏任务队列只有一个任务,执行主线程中的js代码。
3.宏任务队列可以有多个。
4.当宏任务队列中的任务执行完毕后,会查看是否有微任务队列,有则执行微任务队列中的任务,没有则查看是否有宏任务队列

微任务
(1)分类 : Promise中的回调函数.then(),Promise本身是同步任务,process.nextTick Object.observe, MutationObserver
(2)特点 :

1.微任务所处的队列即为微任务队列
2.只有一个微任务队列
3.在上一个宏任务队列执行完毕之后如果有微任务队列就会执行微任务队列中的所有任务

例题一


        setTimeout(()=>{
            console.log("setTimeout"); //宏任务,加入宏任务队列,等待执行
        },0);
        
        new Promise((resolve,reject)=>{
            for(var i=0;i<5;i++){
                console.log(i); //主线程任务,直接执行,打印1 2 3 4 5
            }
            resolve() //修改promise状态为成功
        }).then(()=>{
            console.log("promise回调函数"); //微任务,加入微任务队列等待执行
        })

        console.log("end"); //主线程任务,直接执行,打印 "end"
        //接着执行微任务队列中的任务,打印 "promise回调函数"
        //最后执行宏任务队列中的任务,打印 "setTimeout"
         //start
          1    
          2
          3
          4
          5
          end
          promise回调函数
          setTimeout
        

例题二

            setTimeout(() => {
                console.log('setTimeout'); // 将回调代码放入个宏任务队列,第二轮宏任务执行
            }, 0);
            
            new Promise((resolve, reject) => {
                console.log('---Promise第一轮微任务同步执行---'); //第一轮微任务同步执行
                resolve()
            }).then(() => {
                console.log('Promise.then实例成功回调执行'); // 将回调代码放入微任务队列,第一轮宏任务执行完后立即执行
            });

            console.log('---end---'); //第一轮主线程结束
        </script>
        // ---start---
            ---Promise第一轮微任务同步执行---
            ---end---
             Promise.then实例成功回调执行
            setTimeout

例题三

    setTimeout(function() {
                console.log('1')
            }); //宏任务,分发到宏任务的Event Queue中等待执行
            
            new Promise(function(resolve) {
                console.log('2'); //主线程任务,直接执行,打印 2
                resolve();
            }).then(function() {
                console.log('3') //.then()中的方法属于微任务,分发到微任务的Event Queue中等待执行
            });
            console.log('4'); //主线程任务,直接执行,打印 4
            new Promise(function(resolve) {
                console.log('5'); //主线程任务,直接执行,打印 5
                resolve();
            }).then(function() {
                console.log('6') //,then()中的方法是微任务,分发到微任务Event Queue中等待执行
            });
            setTimeout(function() {
                console.log('7') //宏任务,分发到宏任务的Event Queue中等待执行
            });

            function bar() {
                console.log('8') //主线程任务,直接执行,打印 8
                foo() //调用foo(),属于主线程任务,直接执行,打印 9
            }

            function foo() {
                console.log('9') 
            }
            console.log('10') //主线程任务,直接执行,打印 10
            bar() //10在8 9之前打印,因为js代码是从上到下依次执行,因此console.log(10)先执行
            
            //接着执行微任务队列中的任务,先进先执行,依次打印 3 6
            //最后执行宏任务队列中的任务,先进先执行,一次打印 1 7
            //结果为 2 4 5 10 8 9 3 6 1 7
</script>
相关文章
|
8天前
|
机器学习/深度学习 编解码 前端开发
探索无界:前端开发中的响应式设计深度解析####
【10月更文挑战第29天】 在当今数字化时代,用户体验的优化已成为网站与应用成功的关键。本文旨在深入探讨响应式设计的核心理念、技术实现及最佳实践,揭示其如何颠覆传统布局限制,实现跨设备无缝对接,从而提升用户满意度和访问量。通过剖析响应式设计的精髓,我们将一同见证其在现代Web开发中的重要地位与未来趋势。 ####
34 7
|
10天前
|
编解码 前端开发 UED
探索无界:前端开发中的响应式设计深度解析与实践####
【10月更文挑战第29天】 本文深入探讨了响应式设计的核心理念,即通过灵活的布局、媒体查询及弹性图片等技术手段,使网站能够在不同设备上提供一致且优质的用户体验。不同于传统摘要概述,本文将以一次具体项目实践为引,逐步剖析响应式设计的关键技术点,分享实战经验与避坑指南,旨在为前端开发者提供一套实用的响应式设计方法论。 ####
36 4
|
19天前
|
缓存 前端开发 JavaScript
"面试通关秘籍:深度解析浏览器面试必考问题,从重绘回流到事件委托,让你一举拿下前端 Offer!"
【10月更文挑战第23天】在前端开发面试中,浏览器相关知识是必考内容。本文总结了四个常见问题:浏览器渲染机制、重绘与回流、性能优化及事件委托。通过具体示例和对比分析,帮助求职者更好地理解和准备面试。掌握这些知识点,有助于提升面试表现和实际工作能力。
54 1
|
19天前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
28 1
|
24天前
|
缓存 前端开发 JavaScript
前端的全栈之路Meteor篇(二):容器化开发环境下的meteor工程架构解析
本文详细介绍了使用Docker创建Meteor项目的准备工作与步骤,解析了容器化Meteor项目的目录结构,包括工程准备、环境配置、容器启动及项目架构分析。提供了最佳实践建议,适合初学者参考学习。项目代码已托管至GitCode,方便读者实践与交流。
|
23天前
|
人工智能 资源调度 数据可视化
【AI应用落地实战】智能文档处理本地部署——可视化文档解析前端TextIn ParseX实践
2024长沙·中国1024程序员节以“智能应用新生态”为主题,吸引了众多技术大咖。合合信息展示了“智能文档处理百宝箱”的三大工具:可视化文档解析前端TextIn ParseX、向量化acge-embedding模型和文档解析测评工具markdown_tester,助力智能文档处理与知识管理。
|
30天前
|
人工智能 前端开发 JavaScript
拿下奇怪的前端报错(一):报错信息是一个看不懂的数字数组Buffer(475) [Uint8Array],让AI大模型帮忙解析
本文介绍了前端开发中遇到的奇怪报错问题,特别是当错误信息不明确时的处理方法。作者分享了自己通过还原代码、试错等方式解决问题的经验,并以一个Vue3+TypeScript项目的构建失败为例,详细解析了如何从错误信息中定位问题,最终通过解读错误信息中的ASCII码找到了具体的错误文件。文章强调了基础知识的重要性,并鼓励读者遇到类似问题时不要慌张,耐心分析。
|
29天前
|
JSON 前端开发 JavaScript
前端模块打包器的深度解析
【10月更文挑战第13天】前端模块打包器的深度解析
|
29天前
|
存储 前端开发 JavaScript
前端模块化打包工具的深度解析
【10月更文挑战第13天】前端模块化打包工具的深度解析
|
30天前
|
Web App开发 存储 前端开发
前端开发必备:requestAnimationFrame、setInterval、setTimeout——功能解析与优劣对比
前端开发必备:requestAnimationFrame、setInterval、setTimeout——功能解析与优劣对比
117 0

推荐镜像

更多