首先解释一下单线程这个概念,顾名思义就是在一条线上运行。也就是说引擎对于 js 文件从头到尾依次执行,通常所说的同步就是这个意思。那么,异步是什么意思?
要解释异步首先看一下下方的代码:
request.get("www.xxx.com:8080/articles",function() {})
在这段代码中,有一个匿名 function,这个函数被称为回调函数。在解析 js 时这个函数是不会被立即执行的,只有对服务器的请求完成后这个函数才会被执行。既然这个函数不会被立即执行,那么这个函数及其所在的一段代码就是异步的。单线程异步简单来说就是这种机制。
js 是单线程的,但引擎不是,在引擎中有一个线程叫做「事件触发线程」。这个线程是配合引擎的 js 线程实现 js 异步的。当引擎执行 js 遇到异步的方法时,会将回调函数交给事件触发线程。以上方的代码为例,回调函数交给事件触发程序后,当对服务器的请求完成,事件触发程序会将回调函数添加到它所管理的事件队列中。
这个事件队列会一直等到同步的 js 执行完,添加到执行栈中接着执行。由于事件被触发的条件不同,事件队列会不断更新。js 线程中执行栈为空后就会一直查询事件队列,如果有新被触发的事件就添加到执行栈中执行。这个机制称为事件轮询。