【study】宏任务和微任务的区别是什么

1.宏任务(MacroTask),微任务(MicroTask)

  • 1.二者都是异步
  • 2.同步和异步的区别:
  • (1)同步代码执行:你写的顺序是什么,他就按什么顺序执行,显而易见,同步任务是阻塞的,也就是说,只有前一句执行完成以后,才能进行下一句
  • (2)异步代码的执行:常见的异步就是callback,不是按照写的顺序执行的就是异步,可是异步并不等于非阻塞,callback被调用的时机也是经过执行到它才会被执行,也是一步步往下执行的,只不过不是按照写的程序从上到下的顺序而已,因此若是有些任务占用了整个线程,那么异步任务也会被阻塞,这也是因为JS都是单进程单线程的
  • (3)经典的JS都是单进程单线程的,单现代的JS已经突破了这一点,咱们有方法新建额外地进程共同处理任务,NodeJS也能够在同一个进程中新建线程,浏览器也有要支持线程的计划
  • (4)异步除了回调,还有其余种类的,好比任务,任务是一种队列类型的,先注册的任务先被执行,任务里面,根据执行的时机分为宏任务和微任务,根据什么区分发执行时机,须要去看设计部分
  • 3.进程的切换确定是宏任务,由于须要花费大量的资源
  • 4.线程的切换是微任务,由于只须要在同一个进程中切换就能够了
  • 5.更准确的说,不少微任务都是纤程的切换致使的,纤程是比线程更小的概念
  • 6.为何和定时器有关的任务是宏任务?
  • (1)由于计时是实时的,它必定不能被阻塞,因此定时器被设计在另外一个进程中被管理,因此,定时器任务会有进程的切换,因此只能是宏任务
  • 7.事件为何是宏任务呢?
  • 事件的触发是依赖于浏览器的实现,平台有它本身的事件注册和派发机制,好比nodeJS用的内核libuv,因此无论怎样,事件的独立注册表和派发机制致使,他也不会和JS存在一个进程中,事件的管理中心必定是在另一个进程中实现的,那么去派发事件,也就是宏任务
  • 8.JS自己语法内的
  • (1)好比async/await,它自己是一个迭代器,迭代器利用了纤程,在不一样的纤程之间切换,因此是微任务
  • (2)进程和纤(线)程最大的区别是:进程占用单独的资源,即不会共享CPU和内存,而线程往下,都是共享CPU和内存的,只是在一个空间中在进行拆分,作切换
  • (3)若是是JS自己的命令是进程的话,就没有办法拿到外面上下文的数据了,由于不共享内存
  • (4)JS自己的部分必定是比线程小的
  • 9.非JS自己的
  • 非JS自己的,由于每每被设计成不被JS阻塞的,因此会单独开启一个进程做管理,这样出来的都是宏任务
  • 10.那么像Observer(如MutationObserver等),和一些渲染为何都是微任务呢?
  • (1)虽然它们和JS的自己无关,可是它们的执行时机和它们所在的进程是有关的
  • (2)好比MutationObserver,观察的是DOM,它的做用便是对DOM的变化作出响应,因此,他会在管理DOM的进程中
  • (3)渲染也是同样的,是在整个渲染流程中的某一步做的回调,并无切换出它的自己所在的空间
  • 11.微任务在执行时,它能获取到任务外的上下文
  • 12.宏任务在执行时,他不能获取到任务外的上下文
  • 13.为何定时器任务是宏任务?
  • (1)能够把定时器和定时器任务是分离的,先把定时器想成一个时间管理中心
  • (2)而后在上面注册一个个任务,这些任务自己和时间无关
  • (3)时间管理中心和时间有关的,当时间管理中心发现时间到了,要执行任务,就从任务列表中找出注册的任务,并通知JS执行任务
  • (4)因此能够看到,时间管理中心(定时器的进程)和执行的任务(JS运行时)是无关的,不共享上下文,因此是宏任务
  • (5)控制渲染的函数如requestAnimationFrame,这个函数自己是要求在下一帧重绘前作什么,它的自己被设计成是在渲染的流程中,而后它作的事情应该也是和渲染有关的,也就是这个任务和它所处的空间的上下文一致
  • 14.微任务和宏任务执行的顺序
  • (1)由于微任务不须要执行上下文(这里指的是资源的切换),因此它能够在一次上下文切换间隔中把全部的微任务都作掉
  • (2)而宏任务由于须要切换上下文,因此他会慢点执行
  • (3)因此会先执行已注册的微任务,而后是宏任务
  • (4)这样,就至关于作了一次上下文的切换,若是在此期间,又有新的微任务或宏任务被注册了,就不断重复上面的这个流程
相关文章
相关标签/搜索