基本知识
- 栈:先进后出
函数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。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。