JavaScript中的宏任务和微任务简单区分

本文详细介绍了JavaScript中的任务队列机制,包括同步任务、异步任务以及宏任务和微任务的区别。同步任务在主线程上依次执行,而异步任务则分为宏任务和微任务,分别存在于不同的队列中。宏任务如setTimeout、setInterval及主代码块,微任务如Promise和async/await。微任务在当前宏任务执行完毕后立即执行,确保了及时响应。文章通过案例解释了任务队列的工作流程,帮助理解JavaScript执行机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分类

js中的任务,大致分为2类,一类是同步任务,另一类是异步任务。而异步任务,又分为宏任务和微任务,这两个任务是两个队列,所以是先进先出的。

同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。

异步任务指的是,不进入主线程、而进入"任务队列"的任务,只有等主线程任务执行完毕,"任务队列"开始通知主线程,请求执行任务,该任务才会进入主线程执行

宏任务

主代码块、setTimeout、setInterval等

有些地方会列出来UI Rendering,说这个也是宏任务,可是在读了HTML规范文档以后,发现这很显然是和微任务平行的一个操作步骤

requestAnimationFrame姑且也算是宏任务吧,requestAnimationFrame,下次页面重绘前所执行的操作,而重绘也是作为宏任务的一个步骤来存在的,且该步骤晚于微任务的执行

宏任务是主流,当js开始被执行的时候,就是开启一个宏任务,在宏任务中执行一条一条的指令

宏任务可以同时有多个,但会按顺序一个一个执行;

每一个宏任务,后面都可以跟一个微任务队列,如果微任务队列中有指令或方法,那么就会执行;如果没有,则开始执行下一个宏任务,直到所有的宏任务执行完为止。

微任务

Promise、async/await等

需要注意的是,promise里的then才会被加入微任务,它的resolve是同步里的

async函数里遇到await之前的代码是同步里的,遇到await时,会执行await后面的函数,然后返回一个promise,把await下面的代码放入微任务,并且退出这个async函数。

为什么

为什么有了宏任务,还会有微任务存在?

因为宏任务太占用性能,当需要一些较早就准备好的方法,排在最后才执行的时候,又不想新增一个宏任务,那么就可以把这些方法,一个一个的放在微任务队列里面,在这个宏任务中的代码执行完后,就会执行微任务队列。

案例

console.log('整体script开始。');

setTimeout(()=>{ 
    console.log('宏任务setTimeout的回调函数。') 
})

Promise.resolve().then(function() { 
    console.log('微任务Promise回调函数1。') 
}).then(function() { 
    console.log('微任务Promise回调函数2。') 
}) 
console.log('整体script结束。')

结果 整体script开始。 整体script结束。 微任务Promise回调函数1。 微任务Promise回调函数2。 宏任务setTimeout的回调函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值