pengzhanbo
650字约2分钟
2022-04-17
提问
Event-Loop 是一个执行模型,在 html5规范 中进行了浏览器端的 Event-Loop 的明确定义。
javascript 有两种异步任务,分别是宏任务
和微任务
宏任务,macro task
,也叫 tasks
,一些异步任务的回调会依次进入 macro task queue
,等待后续被调用。
这些异步任务包括:
微任务, micro task
, 也叫 jobs
,另一些异步任务的回调会依次进入micro task queue
,等待后续被调用。
这些异步任务包括:
script
代码,这些代码有一些是同步语句,有一些是异步语句(如: setTimeout);script
同步代码执行完毕后,调用栈Stack会清空;micro task queue
中取出位于队首的任务,放入调用栈Stack中执行,执行完后micro task queue
长度减一;micro task queue
位于队首的任务,放入调用栈Stack中执行, 以此类推,直到把micro task queue
中的所有任务都执行完毕。注意,如果在执行micro task的过程中,产生了micro task
那么会加入到队列的末尾,也会在这个周期被调用执行;micro task
中的所有无人都执行完毕,此时 micro task queue
为空队列,调用栈Stack也为空;macro task queue
中位于队首的任务,放入Stack中执行;重点
marco task
一次只从队列中取出一个任务执行,执行后就去执行微任务队列中的任务;micro task queue
为空, 且当前微任务执行过程中产生新的micro task
,也会加入到当前micro task queue
;UI Rendering
由浏览器自定判断决定执行节点。但是只要执行UI Rendering
,它的节点是在执行完所有 micro task
之后,下一个macro task
之前,紧跟着执行UI Rendering