摘要:參考可否多線程深入理解定時(shí)機(jī)制到這里就要說另一個(gè)問題的異步問題在中我們常常使用的方式來處理的異步炒個(gè)栗子輸出不信點(diǎn)我試試并沒有把你的回調(diào)函數(shù)掛在事件循環(huán)隊(duì)列中。
瀏覽器三個(gè)常駐線程
瀏覽器的內(nèi)核是多線程的,它們?cè)趦?nèi)核制控下相互配合以保持同步,一個(gè)瀏覽器至少實(shí)現(xiàn)三個(gè)常駐線程:
javascript引擎線程javascript引擎是基于事件驅(qū)動(dòng)單線程執(zhí)行的,JS引擎一直等待著任務(wù)隊(duì)列中任務(wù)的到來,然后加以處理,瀏覽器無論什么時(shí)候都只有一個(gè)JS線程在運(yùn)行JS程序
GUI渲染線程GUI渲染線程負(fù)責(zé)渲染瀏覽器界面,當(dāng)頁面需要重繪(repaint)或由于某種操作引發(fā)的回流(reflow)時(shí),該線程就會(huì)執(zhí)行.但是,需要注意的是GUI渲染線程與javascript引擎線程是互斥的,當(dāng)js引擎執(zhí)行時(shí),GUI線程就會(huì)被掛起,GUI更新會(huì)被保存在一個(gè)隊(duì)列中,等待js引擎空閑時(shí)立即被執(zhí)行.
事件觸發(fā)線程事件觸發(fā)線程,當(dāng)一個(gè)事件被觸發(fā)時(shí),該線程會(huì)把事件添加到待處理隊(duì)列的隊(duì)尾,等待JS引擎的處理。這些事件可來自JavaScript引擎當(dāng)前執(zhí)行的代碼塊如setTimeOut、也可來自瀏覽器內(nèi)核的其他線程如鼠標(biāo)點(diǎn)擊、AJAX異步請(qǐng)求等,但由于JS的單線程關(guān)系所有這些事件都得排隊(duì)等待JS引擎處理。
參考:
JavaScript可否多線程? 深入理解JavaScript定時(shí)機(jī)制
到這里, 就要說另一個(gè)問題, js的異步問題
setTimeout(...,0)在js中,我們常常使用setTimeout(function(){},0)的方式來處理js的異步.
炒個(gè)栗子
console.log(1); setTimeout(function(){console.log(2)},0); console.log(3);
輸出: 1 , 3, 2
不信點(diǎn)我試試
setTimeout(..) 并沒有把你的回調(diào)函數(shù)掛在事件循環(huán)隊(duì)列中。它所做的是設(shè) 定一個(gè)定時(shí)器。
當(dāng)定時(shí)器到時(shí)后,環(huán)境會(huì)把你的回調(diào)函數(shù)放在事件隊(duì)列中,如果這時(shí)候事件循環(huán)中已經(jīng)有 20 個(gè)項(xiàng)目了會(huì)怎樣呢?你的回調(diào)就會(huì)等待,定時(shí)器只能確保你的回調(diào)函數(shù)不會(huì)在指定的 時(shí)間間隔之前運(yùn)行,但可能會(huì)在那個(gè)時(shí)刻運(yùn)行,也可能在那之后運(yùn)行,要根據(jù)事件隊(duì)列的 狀態(tài)而定(PS: 這就是造成定時(shí)器不準(zhǔn)確的緣由)。
setTimeout(..0)(hack)進(jìn)行異步調(diào)度,基本上它的意思就是把這個(gè)函數(shù)插入到當(dāng)前事件循環(huán)隊(duì)列的結(jié)尾處。
正常情況下javascript都是按照順序執(zhí)行的。但是我們可能讓該語句后面的語句執(zhí)行完再執(zhí)行本身,先執(zhí)行所有的同步再執(zhí)行所有的異步.
炒個(gè)栗子
for(var i = 0;i < 3;i++){ setTimeout(function(){ alert("知乎"); },0) alert(i); }
點(diǎn)我看看
輸出: 0 1 2 知乎 知乎 知乎,
setTimeout第二個(gè)參數(shù)為0表示立即執(zhí)行。當(dāng)使用這個(gè)方法的時(shí)候,瀏覽器會(huì)另起一個(gè)線程,來執(zhí)行setTimeout里面的函數(shù),而原有的線程繼續(xù)執(zhí)行, 待原有線程結(jié)束后,在執(zhí)行后面的線程(js單線程)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91323.html
摘要:事件觸發(fā)線程主要負(fù)責(zé)將準(zhǔn)備好的事件交給引擎線程執(zhí)行。它將不同的任務(wù)分配給不同的線程,形成一個(gè)事件循環(huán),以異步的方式將任務(wù)的執(zhí)行結(jié)果返回給引擎。 Fundebug經(jīng)作者浪里行舟授權(quán)首發(fā),未經(jīng)同意請(qǐng)勿轉(zhuǎn)載。 前言 本文我們將會(huì)介紹 JS 實(shí)現(xiàn)異步的原理,并且了解了在瀏覽器和 Node 中 Event Loop 其實(shí)是不相同的。 一、線程與進(jìn)程 1. 概念 我們經(jīng)常說 JS 是單線程執(zhí)行的,...
摘要:引擎單線程機(jī)制首先明確,引擎是單線程機(jī)制。是單線程執(zhí)行的,無法同時(shí)執(zhí)行多段代碼。解析是單線程的,所以會(huì)先執(zhí)行再,但這個(gè)循環(huán)體是死循環(huán),所以永遠(yuǎn)不會(huì)執(zhí)行。 Javascript 引擎單線程機(jī)制 首先明確,JavaScript引擎是單線程機(jī)制。 JavaScript 是單線程執(zhí)行的,無法同時(shí)執(zhí)行多段代碼。當(dāng)某一段代碼正在執(zhí)行的時(shí)候,所有后續(xù)的任務(wù)都必須等待,形成一個(gè)任務(wù)隊(duì)列。一旦當(dāng)前任務(wù)...
摘要:需要注意的是,及更早的瀏覽器不支持第一種語法中向延遲函數(shù)傳遞額外參數(shù)的功能。如果在不改變遞歸模式的前提下修善這段代碼解決方案加入定時(shí)器題目四考察和系列解釋立即的對(duì)象,是在本輪事件循環(huán)的結(jié)束時(shí),而不是在下一輪事件循環(huán)的開始時(shí)。 前言:setTimeout是JavaScript中常見的一個(gè)window對(duì)象方法,本文將介紹關(guān)于它的一些基礎(chǔ)知識(shí)和易出錯(cuò)的地方。 1、基礎(chǔ)知識(shí) 作用:setTim...
摘要:事件觸發(fā)線程主要負(fù)責(zé)將準(zhǔn)備好的事件交給引擎線程執(zhí)行。進(jìn)程瀏覽器渲染進(jìn)程瀏覽器內(nèi)核,主要負(fù)責(zé)頁面的渲染執(zhí)行以及事件的循環(huán)。第二輪循環(huán)結(jié)束。 將自己讀到的比較好的文章分享出來,大家互相學(xué)習(xí),各位大佬有好的文章也可以留個(gè)鏈接互相學(xué)習(xí),萬分感謝! 線程與進(jìn)程 關(guān)于線程與進(jìn)程的關(guān)系可以用下面的圖進(jìn)行說明: showImg(https://segmentfault.com/img/bVbjSZt?...
摘要:事件觸發(fā)線程主要負(fù)責(zé)將準(zhǔn)備好的事件交給引擎線程執(zhí)行。進(jìn)程瀏覽器渲染進(jìn)程瀏覽器內(nèi)核,主要負(fù)責(zé)頁面的渲染執(zhí)行以及事件的循環(huán)。第二輪循環(huán)結(jié)束。 將自己讀到的比較好的文章分享出來,大家互相學(xué)習(xí),各位大佬有好的文章也可以留個(gè)鏈接互相學(xué)習(xí),萬分感謝! 線程與進(jìn)程 關(guān)于線程與進(jìn)程的關(guān)系可以用下面的圖進(jìn)行說明: showImg(https://segmentfault.com/img/bVbjSZt?...
閱讀 857·2021-11-25 09:43
閱讀 3689·2021-11-19 09:40
閱讀 893·2021-09-29 09:34
閱讀 1808·2021-09-26 10:21
閱讀 885·2021-09-22 15:24
閱讀 4205·2021-09-22 15:08
閱讀 3281·2021-09-07 09:58
閱讀 2699·2019-08-30 15:55