什么是 EventLoop?
从名称上来看,EventLoop 是事件循环,由于 JS 是单线程的,在执行代码的时候,如果碰到一些异步代码(例如 AJAX),JS 会发送一个请求,并且发送了一个消息,然后继续执行下面的代码。那么这个时候,就需要有人轮询地去确认那个网络资源是否返回,再把结果返回到 JS 代码中。网络请求是一种事件,在浏览器的环境中,JS 还会有其他异步代码,而管理这些事件,以及遵循特定的规则将事件通知 JS,这一模块就是 EventLoop。浏览器环境和 Node.js 的实现是有区别的。
对于前端开发人员来说,一般只需要了解一些异步事件的执行顺序即可。
宏任务和微任务
在浏览器环境中,异步事件都可以被分类为宏任务或者是微任务。
- 宏任务:setTimeout
- 微任务:Promise.then(fn), await 的代码可以等价转换成 Promise,比如
await fn() -> fn().then()
当我们执行完一个宏任务后,就会把当前的微任务都执行完,再看是否有宏任务,如此循环。