JavaScript
引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript
程序。
JavaScript
可以异步执行,这种能力是由其执行环境(比如浏览器,Node)赋予的。
JavaScript
一般有以下三个线程:
JavaScript
引擎是单线程执行的,JS
引擎一直等待着任务队列中任务的到来,然后加以处理,浏览器无论什么时候都只有一个JS
线程在运行JS
程序。GUI
渲染线程负责渲染浏览器界面,当界面需要重绘(Repaint)
或由于某种操作引发回流(reflow)
时,该线程就会执行。但需要注意GUI
渲染线程与JS
引擎是互斥的,当JS
引擎执行时GUI
线程会被挂起,GUI
更新会被保存在一个队列中等到JS
引擎空闲时立即被执行。事件触发线程,当一个事件被触发时该线程会把事件添加到待处理队列的队尾,等待
JS
引擎的处理。这些事件可来自JavaScript
引擎当前执行的代码块如setTimeOut
、也可来自浏览器内核的其他线程如鼠标点击、AJAX
异步请求等,但由于JS
的单线程关系所有这些事件都得排队等待JS
引擎处理。