一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情。
-
堆(Heap)
: 堆表示一大块非结构化的内存
区域,对象,数据
被存放在堆中 -
栈(Stack)
: 栈在javascript中又称执行栈,调用栈,是一种后进先出
的数组结构,Javascript
有一个 主线程(main thread
)和 调用栈(或执行栈call-stack
),主线各所有的任务都会被放到调用栈等待主线程执行。- JS调用栈采用的是后进先出的规则,当函数执行的时候,会被添加到栈的顶部,当执行栈执行完成后,就会从栈顶移出,直到栈内被清空。
-
队列(Queue)
: 队列即任务队列Task Queue
,是一种先进先出的
一种数据结构。在队尾添加新元素,从队头移除元素。
主线程
所有的同步任务都是在主线程里执行的,异步任务可能会在macrotask
或者microtask
里面
- 同步任务: 指的是在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。
- 异步任务: 指的是不进入主线程,某个异步任务可以执行了,该任务才会进入主线程执行。
微任务(micro task)
- new Promise().then(回调)
- process.nextTick(node独有)
- async
- await
- process.nextTick(node)
- mutationObserver(html5新特性)
宏任务(macro task)
- script(整体代码)
- setTimeout
- setInterval
- setImmediate(node独有)
- I/O
- UI render
在同一个上下文中,总的执行顺序为同步代码—>microTask—>macroTask
具体来说,浏览器会不断从task队列中按顺序取task执行,每执行完一个task都会检查microtask队列是否为空(执行完一个task的具体标志是函数执行栈为空),如果不为空则会一次性执行完所有microtask。然后再进入下一个循环去task队列中取下一个task执行,以此类推。