首先我們來看幾個(gè)問題:
1.JS是單線程的么囤屹?
2.JS有異步么氏豌?
3.JS單線程怎么實(shí)現(xiàn)的的異步
1.JS是單線程的么台诗?
這個(gè)問題毫無懸念驱敲,肯定是單線程的铁蹈。js剛開始就是作為瀏覽器腳本語言推出的,試想如果是多線程:
那么一個(gè)線程在某個(gè)DOM節(jié)點(diǎn)上添加內(nèi)容众眨,另一個(gè)線程刪除了這個(gè)節(jié)點(diǎn)握牧,這時(shí)瀏覽器應(yīng)該以哪個(gè)線程為準(zhǔn)?
這樣就復(fù)雜化了围辙,HTML5提出Web Worker標(biāo)準(zhǔn)我碟,允許JavaScript腳本創(chuàng)建多個(gè)線程,但是子線程完全受主線程控制姚建,且不得操作DOM矫俺。也就是說始終是單線程,而且單線程的含義是js只能在一個(gè)線程上運(yùn)行掸冤,也就是說厘托,js同時(shí)只能執(zhí)行一個(gè)js任務(wù),其它的任務(wù)則會(huì)排隊(duì)等待執(zhí)行稿湿。
2.JS有異步么铅匹?
JS使用ajax獲取后臺(tái)數(shù)據(jù)就是一個(gè)異步的過程,promise等
3.JS單線程怎么實(shí)現(xiàn)的的異步饺藤?
看了很多資料包斑,說一下我的理解:
js引擎不只一個(gè)線程,執(zhí)行js代碼的是js主線程涕俗,還有GUI渲染線程罗丰,瀏覽器事件觸發(fā)線程等。js主線程執(zhí)行的時(shí)候遇到同步任務(wù)時(shí)按照后入先出的順序同步執(zhí)行再姑,碰到異步任務(wù)的時(shí)候萌抵,將這個(gè)任務(wù)的回調(diào)加入到消息隊(duì)列,當(dāng)主線程執(zhí)行完同步任務(wù)時(shí),會(huì)去獲取隊(duì)列中的回調(diào)绍填,然后放到主線程順序執(zhí)行霎桅,如下圖:
轉(zhuǎn)引自Philip Roberts的演講《Help, I'm stuck in an event-loop》
參考自:
1.瀏覽器JS運(yùn)行機(jī)制(線程)——一只dororo
2.JavaScript 運(yùn)行機(jī)制詳解——阮一峰