JavaScript 宏任务和微任务

· 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
	...
]

分析代码中异步执行的顺序为:

From 极客时间