前言
有人称Event Loop为事件循环机制,而我更愿意将其解释为事件轮询机制,在之后的内容中你会感受到这一点的区别在哪里。说是事件轮询机制,我们也可以说是任务轮询机制,因为英文是Event Loop,所以我们在此文中将其翻译为事件轮询。
阅读本文之前,首先对JavaScript的单线程和异步要有一定的了解,对此不了解的可以先阅读一下我的另一篇博文《JavaScript的单线程和异步》。
ECMA只负责指定标准,Event Loop如何实现,它并不关心。
本文在概念的结构顺序上参考了阮一峰老师的博客《再谈javascript的运行机制: Event Loop》,理解也大多源于此文,加上个人看法,以更容易让读者理解的方式表述出来。
在讲JavaScript的事件轮询机制之前,让我们先来了解几个重要的概念:
任务队列
我们知道,由于JavaScript是单线程,这意味着所有任务都要排队等待执行,后面的任务要等待前面的任务执行结束才能开始执行,如果前一个任务耗时比较久的话,后一个任务就必须一直等待。
我们在《JavaScript的单线程和异步》一文中指出,CPU的运算能力往往是过剩的,我们等待的时间主要是IO操作的时间,这时候会发现,有时候javascript的主线程完全可以不管这些IO操作的任务,我们可以先将这些任务挂起,执行后面的任务,等到IO操作返回了结果,再将之前挂起的任务继续执行。
根据上述的情况,我们大致可以将这分为两种任务:同步任务(synchronous) 和 异步任务(asynchronous)。