2

基本知识

  1. 栈:先进后出
    函数a调用函数b,b调用函数c。执行函数a,a入栈,a调用b, b入栈, b调用c,c入栈,c执行,返回结果,弹出栈,依次类推,最后a出栈 === 》先进后出
  2. 指针:当函数执行完毕后

    • 基本数据类型会从 stack 中弹出
    • 对象、数组的值是存在于 heap(堆) 中的,stack 只弹出指针了他们对应的指针。而真正的值依然存在 heap 中,然后由垃圾回收器自动的清理回收。
  3. 异步任务是由浏览器执行的。当任务执行完之后,浏览器会将任务执行的结果和实现定义的回调函数放入主线程中。所以当主线程任务阻塞的时候,任务队列还是可以正常进行的。

macro tasks 和 micro tasks 分类

没有找到很官方的定义,这个与浏览器引擎相关,看浏览器引擎怎么定义任务的分类,以下是比较普遍的分类
  1. macro tasks: 定时器、http、IO操作(setTimeout, setInterval, setImmediate, I/O, UI rendering)
  2. micro tasks: process.nextTick, Promises, Object.observe(废弃), MutationObserver

执行顺序

在同一轮执行中,micro tasks优先级比macro tasks高
  1. 在执行同步任务过程中,碰到了macro tasks或者micro tasks,将其放入相对应的栈中。
  2. 先将所有的同步任务执行完
  3. 查看micro tasks,里面是否有任务,有的话,执行完所有的任务。
  4. micro tasks执行过后,查看macro tasks,查看里面是否有任务,如果有,执行第一个放入的任务。
  5. micro tasks执行完一个后,重复步骤1,2,3,4。

oylp
365 声望17 粉丝

只是一个普普通通喜欢吃脂肪还长肉的人