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