资讯专栏INFORMATION COLUMN

Macrotasks 和 Microtasks

SimonMa / 2918人阅读

摘要:基本知识栈先进后出函数调用函数调用函数。而真正的值依然存在中,然后由垃圾回收器自动的清理回收。异步任务是由浏览器执行的。当任务执行完之后,浏览器会将任务执行的结果和实现定义的回调函数放入主线程中。

基本知识

栈:先进后出
函数a调用函数b,b调用函数c。执行函数a,a入栈,a调用b, b入栈, b调用c,c入栈,c执行,返回结果,弹出栈,依次类推,最后a出栈 === 》先进后出

指针:当函数执行完毕后

基本数据类型会从 stack 中弹出

对象、数组的值是存在于 heap(堆) 中的,stack 只弹出指针了他们对应的指针。而真正的值依然存在 heap 中,然后由垃圾回收器自动的清理回收。

异步任务是由浏览器执行的。当任务执行完之后,浏览器会将任务执行的结果和实现定义的回调函数放入主线程中。所以当主线程任务阻塞的时候,任务队列还是可以正常进行的。

macro tasks 和 micro tasks 分类
没有找到很官方的定义,这个与浏览器引擎相关,看浏览器引擎怎么定义任务的分类,以下是比较普遍的分类

macro tasks: 定时器、http、IO操作(setTimeout, setInterval, setImmediate, I/O, UI rendering)

micro tasks: process.nextTick, Promises, Object.observe(废弃), MutationObserver

执行顺序
在同一轮执行中,micro tasks优先级比macro tasks高

在执行同步任务过程中,碰到了macro tasks或者micro tasks,将其放入相对应的栈中。

先将所有的同步任务执行完

查看micro tasks,里面是否有任务,有的话,执行完所有的任务。

micro tasks执行过后,查看macro tasks,查看里面是否有任务,如果有,执行第一个放入的任务。

micro tasks执行完一个后,重复步骤1,2,3,4。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/98077.html

相关文章

  • 浏览器环境下的microtaksmacrotasks

    摘要:的回调函数正是处于队列之中。将看做会导致性能问题,回调函数可能会因为渲染等相关产生不必要的延后。浏览器是怎么出错的和在两次点击操作之间运行完成了所有的,就比如的回调函数所展示的,但是似乎有不同的排序算法。 带有可视代码执行顺序的原文链接https://jakearchibald.com/201...,此篇文字并非其完整翻译,加入了一部分自己的理解,比如将其中的task替换为macrot...

    econi 评论0 收藏0
  • 浏览器环境下的microtaksmacrotasks

    摘要:的回调函数正是处于队列之中。将看做会导致性能问题,回调函数可能会因为渲染等相关产生不必要的延后。浏览器是怎么出错的和在两次点击操作之间运行完成了所有的,就比如的回调函数所展示的,但是似乎有不同的排序算法。 带有可视代码执行顺序的原文链接https://jakearchibald.com/201...,此篇文字并非其完整翻译,加入了一部分自己的理解,比如将其中的task替换为macrot...

    FreeZinG 评论0 收藏0
  • JS异步笔试题

    摘要:分析题目先执行微任务后执行宏任务因此结果为按照这个思路做以下题目做出如下更改运行结果为更改如下更改如下运行结果为运行结果为运行结果为参考自 参考自https://github.com/Advanced-F... 以下是一道异步的笔试题,写出运行结果: async function async1() { console.log(async1 start); await a...

    Tangpj 评论0 收藏0
  • js的事件循环

    摘要:但是事件循环一般会在主线程中任务执行完成之后执行。所以,上面函数的调用栈过程如下总结的事件循环部分,内容应该算是全部阐述完全了。 前言 还记得那些年面试官问你的定时器的原理吗?还有呢?Promise的原理呢?原理、原理、原理,问的我们怀疑人生。 为了下次不再懵逼,今天,我们来了解一下Event Loop的概念。我们的初衷是真正的了解和掌握它,了解整体JavaScript的运行机制。至少...

    android_c 评论0 收藏0
  • 前端周记20190211-20190215

    摘要:任务队列是一个事件队列,只要指定过回调函数的事件在事件发生时就会进入任务队列。回调函数会被主线程挂起来的代码,异步任务必须指定回调函数。 1、静态公有方法 (function(){ var privateVariable=10; function privateFunction(){ return false; } MyObject=fu...

    loonggg 评论0 收藏0

发表评论

0条评论

SimonMa

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<