· 337 words · 2 min
当拿到一段 JS 代码时,浏览器/Node(宿主)首先要做的就是把代码传递给 JS 引擎,要求其去执行。
一个感性的认知是 JS 引擎常驻于内存之中,等待这宿主把 JS 代码传递给它去执行。
在 ES6 之后由于 Promise
的出现,JS 引擎也可以自己发起任务了。
宿主发起的任务成为宏任务(setTimeout
是宿主环境提供的,因此属于宿主发起的宏任务),JS 引擎发起的任务称为微任务。
事件循环是在一个独立线程中的循环。整个循环做的事基本为“等待 - 执行”(实际上更为复杂)。
每次的循环,都是一个宏任务。在宏任务中,JS 的 Promise
会产生异步代码,
JS 必须保证异步代码在一个宏任务中完成,因此每个宏任务中又包含了一个微任务队列。
// event loop
[
[microTask, microTask, ...], // macroTask
[microTask, microTask, ...], // macroTask
...
]
分析代码中异步执行的顺序为: