前端宏任务与微任务解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 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>
相关文章
|
1月前
|
缓存 前端开发 中间件
[go 面试] 前端请求到后端API的中间件流程解析
[go 面试] 前端请求到后端API的中间件流程解析
|
29天前
|
前端开发 UED 开发者
颠覆你的前端知识:防抖与节流的区别及实战解析!
【8月更文挑战第23天】在Web前端开发中,处理用户界面交互产生的事件可能会影响性能。为此,我们有两种优化方法:防抖(debounce)和节流(throttle)。防抖确保函数仅在事件停止触发一段时间后执行一次,适用于如搜索自动补全场景。而节流则确保函数按固定时间间隔执行,不管用户操作频率如何。本篇技术博客将深入解析两者差异并提供示例代码,帮助开发者更好地理解和应用这些技巧以提升应用性能和用户体验。
57 0
|
1月前
|
JSON 前端开发 Java
【前端学java】SpringBootWeb极速入门-请求参数解析(02)
【8月更文挑战第12天】SpringBootWeb极速入门-请求参数解析(02)
15 1
【前端学java】SpringBootWeb极速入门-请求参数解析(02)
|
29天前
|
存储 前端开发 JavaScript
深入Web前端:栈与堆的优缺点全解析,让你大开眼界!
【8月更文挑战第23天】本文以问答形式解析了Web前端开发中至关重要的内存管理概念——栈与堆。栈采用后进先出(LIFO)原则存储执行上下文,适用于函数调用管理;而堆则灵活存储如对象和数组等复杂数据类型。栈操作迅速但访问受限,堆则提供动态空间分配但可能牺牲内存效率。理解两者特性有助于提升JavaScript编程技巧。
30 1
|
1月前
|
JavaScript 算法 前端开发
"揭秘Vue.js的高效渲染秘诀:深度解析Diff算法如何让前端开发快人一步"
【8月更文挑战第20天】Vue.js是一款备受欢迎的前端框架,以其声明式的响应式数据绑定和组件化开发著称。在Vue中,Diff算法是核心之一,它高效计算虚拟DOM更新时所需的最小实际DOM变更,确保界面快速准确更新。算法通过比较新旧虚拟DOM树的同层级节点,递归检查子节点,并利用`key`属性优化列表更新。虽然存在局限性,如难以处理跨层级节点移动,但Diff算法仍是Vue高效更新机制的关键,帮助开发者构建高性能Web应用。
40 1
|
21天前
|
前端开发 UED 开发者
React组件优化全攻略:深度解析让你的前端应用飞速运行的秘诀——从PureComponent到React.memo的彻底性能比较
【8月更文挑战第31天】在构建现代Web应用时,性能是提升用户体验的关键因素。React作为主流前端库,其组件优化尤为重要。本文深入探讨了React组件优化策略,包括使用`PureComponent`、`React.memo`及避免不必要的渲染等方法,帮助开发者显著提升应用性能。通过实践案例对比优化前后效果,不仅提高了页面渲染速度,还增强了用户体验。优化React组件是每个开发者必须关注的重点。
35 0
|
21天前
|
前端开发 JavaScript 大数据
React与Web Workers:开启前端多线程时代的钥匙——深入探索计算密集型任务的优化策略与最佳实践
【8月更文挑战第31天】随着Web应用复杂性的提升,单线程JavaScript已难以胜任高计算量任务。Web Workers通过多线程编程解决了这一问题,使耗时任务独立运行而不阻塞主线程。结合React的组件化与虚拟DOM优势,可将大数据处理等任务交由Web Workers完成,确保UI流畅。最佳实践包括定义清晰接口、加强错误处理及合理评估任务特性。这一结合不仅提升了用户体验,更为前端开发带来多线程时代的全新可能。
22 0
|
29天前
|
自然语言处理 前端开发 JavaScript
前端进阶必读:JS闭包深度解析,掌握这一特性,你的代码将焕然一新!
【8月更文挑战第23天】闭包是JavaScript的一项高级功能,让函数能够访问和操作外部函数作用域中的变量。本文深入解析闭包概念、组成及应用场景。闭包由函数及其词法环境构成,通过在一个函数内定义另一个函数来创建。它有助于封装私有变量、维持状态和动态生成函数。然而,不当使用闭包可能导致内存泄漏或性能问题。掌握闭包对于实现模块化代码和成为优秀前端开发者至关重要。
30 0
|
1月前
|
自然语言处理 计算机视觉 Python
VisProg解析:根据自然语言指令解决复杂视觉任务
VisProg是一个神经符号系统,能够根据自然语言指令生成并执行Python程序来解决复杂的视觉任务,提供可解释的解决方案。
30 0
|
2月前
|
前端开发 Java 项目管理
List.of 问题之使用List.of方法为什么会引发前端解析失败的问题,如何解决
List.of 问题之使用List.of方法为什么会引发前端解析失败的问题,如何解决

热门文章

最新文章

推荐镜像

更多