1. JavaScript是单线程语言
JavaScript是一门单线程语言,在最新的html5中提出了web-worker,但是JavaScript是单线程的核心并没有改变。
所有关于JavaScript的多线程都是由单线程模拟出来的。
2. JavaScript的事件循环
由于JavaScript是单线程,所以很多任务只能一个一个排队,这对于用户体验是非常不友好的。因此聪明的程序员就把任务分为两类:
同步任务
异步任务
当我们打开一个网页的时候,网页的渲染和dom解析就是同步任务,而加载图片、音乐等大量下载任务的时候就是异步任务。
借用一张图片
JavaScript的执行机制
同步和异步任务分别进入不同的执行“场所”,同步的进入主线程,异步的进入Event Table并注册函数
当指定的事情完成时,Event Table会将这个函数移入Event Queue
主线程内的任务执行完毕为空的时候,会去Event Queue读取对应的函数,进入主线程执行
上述过程会不断重复,也就是常说的Event Loop(事件循环)
如何知道主线程的执行栈为空?js引擎存在monitoring process进程,会持续不断的检查主线程执行栈是否为空,一旦为空,就会去Event Queue那里检查是否有等待被调用的函数。
let data = [];
$.ajax({