JavaScript为什么是单线程的?
是因为它同一时间只能做一件事,主要是避免如下矛盾情况:假如有两个线程,一个在修改某个DOM节点,另一个删除这个节点,这时浏览器以哪个线程的操作为主? 因此浏览器从设计之初就被设计为单线程的。
新标准允许创建多个线程,但没有改变单线程的本质
HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。
主线程和任务队列
单线程就意味着,前一个任务结束,后一个任务才会执行,如果前面的任务执行时间很长,后面的任务就必须一直等待。于是,JavaScript的设计者想到一个解决方法,将所有的任务分为同步任务和异步任务。同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程、而进入"任务队列"的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。
简言之就是JS只有一个主线程,主线程执行完执行栈的任务后去检查异步的任务队列,如果异步事件触发,则将其加到主线程的执行栈。