JavaScript引擎是單線程的;JavaScript的主要用途是與用戶互動以及操作DOM,為例避免復(fù)雜的同步問題,使其同一時間只能做一件事情,所以JavaScript是單線程的。
本教程操作環(huán)境:windows10系統(tǒng)、javascript1.8.5版、Dell G3電腦。
javascript引擎是單線程嗎
JavaScript引擎是單線程的。
JS為什么是單線程的? 為什么需要異步? 單線程又是如何實現(xiàn)異步的呢?
技術(shù)的出現(xiàn),都跟現(xiàn)實世界里的應(yīng)用場景密切相關(guān)的。
同樣的,我們就結(jié)合現(xiàn)實場景,來回答問題
(1) JS為什么是單線程的?
單線程:同一個時間只能做一件事
JavaScript的單線程,與他的用途有關(guān)。作為瀏覽器腳本語言,JavaScript的主要用途是與用戶互動,以及操作DOM。這就決定了他只能是單線程,否則會帶來很復(fù)雜的同步問題。比如,假定JavaScript同時有兩個線程,一個線程在某個DOM節(jié)點上添加內(nèi)容,另一個線程刪除了這個節(jié)點,這時瀏覽器應(yīng)該以哪個線程為準?
為了利用多核CPU的計算能力,HTML5提出Web Worker 標(biāo)準,允許JavaScript腳本創(chuàng)建多個線程,但是子線程完全受主線程控制,且不得操作DOM。所以,這個新標(biāo)準并沒有改變JavaScript單線程的本質(zhì)。
JS最初被設(shè)計用在瀏覽器中,那么想象一下,如果瀏覽器中的JS是多線程的。
場景描述:
那么現(xiàn)在有2個進程,process1 process2,由于是多進程的JS,所以他們對同一個dom,同時進行操作
process1 刪除了該dom,而process2 編輯了該dom,同時下達2個矛盾的命令,瀏覽器究竟該如何執(zhí)行呢?
這樣想,JS為什么被設(shè)計成單線程應(yīng)該就容易理解了吧。
(2) JS為什么需要異步?
場景描述:
如果JS中不存在異步,只能自上而下執(zhí)行,如果上一行解析時間很長,那么下面的代碼就會被阻塞。
對于用戶而言,阻塞就意味著"卡死",這樣就導(dǎo)致了很差的用戶體驗
所以,JS中存在異步執(zhí)行。