JavaScript事件轮询总结


事件轮询机制是JavaScript引擎的一个经典问题,有很多讲解的文档,但大多还是不够简洁清晰,我来重新总结一个精简版。

如下图:

事件轮询机制:
众所周知,JavaScript的执行是单线程的,主线程无论何时只执行一个任务:
 1、所有的JavaScript代码会在主线程执行;
 2、JavaScript任务大体分为:同步任务和异步任务;
 3、同步任务直接在主线程执行,会阻塞后续代码的执行;
 4、异步任务不会立马执行,先交由对应的异步任务管理模块来管理:
 (1)定时器的管理模块;
 (2)Ajax请求的管理模块;
 (3)DOM事件的管理模块;
 5、当异步任务满足执行的条件,对应的管理模块会将异步对应的回调放置在事件队列中等待执行;
 6、等待主线程代码执行完执行事件队列中的任务;

JavaScript任务系分又可分为 宏任务和微任务:
宏任务:由宿主环境提供,比如setTimeout、setInterval、网络请求、用户I/O、script(整体代码)、UI rendering、setImmediate(node);
微任务:语言标准(ECMAScript)提供,如process.nextTick(node)、Promise、Object.observe、MutationObserver。

宏任务和微任务的执行流程:
1、主线程上的代码执行完成之后会先执行微任务队列中的任务(如果有微任务);
2、微任务队列清空后执行宏任务队列中的任务,但不是一次性清空;
3、每执行一个宏任务之前会先回清空微任务队列;

【详细讲解参考: https://segmentfault.com/a/1190000012925872#articleHeader8


一片冰心在玉壶