首頁  >  文章  >  web前端  >  單線程JS與多線程瀏覽器的使用

單線程JS與多線程瀏覽器的使用

php中世界最好的语言
php中世界最好的语言原創
2018-03-16 15:17:121683瀏覽

這次帶給大家單線程JS與多線程瀏覽器的使用,單線程JS與多線程瀏覽器的使用的注意事項有哪些,下面就是實戰案例,一起來看一下。

JS語言是單線程的,瀏覽器只分配給js一個主線程,用來執行任務(函數),但一次只能執行一個任務,這些任務形成一個任務隊列排隊等候執行。

瀏覽器是多執行緒的

前端某些任務是非常耗時的,例如網路請求,計時器和事件監聽,如果讓他們和別的任務一樣,都老實的排隊等待執行的話,執行效率會非常的低,甚至導致頁面的假死。所以,瀏覽器是多執行緒的,例如Webkit或Gecko引擎,都可能有以下執行緒:

#javascript引擎執行緒

##http請求執行緒

介面渲染執行緒

瀏覽器事件觸發執行緒

JS單執行緒與Ajax非同步

既然說JS是單執行緒運行的,那為什麼XMLHttpRequest在連線後是異步的?這是由瀏覽器新開一個線程請求。當請求的狀態變更時,如果先前已設定回調,這非同步執行緒就產生狀態變更事件放到 JavaScript引擎的

事件處理佇列中等待處理。當瀏覽器空閒的時候出佇列任務被處理,JavaScript引擎總是單執行緒執行回呼函數。 javascript引擎確實是單執行緒處理它的任務佇列,能理解成就是普通函數和回呼函數所構成的佇列。 即Ajax請求確實是非同步的,這是由瀏覽器新開一個執行緒請求,事件回呼的時候是放入Event loop單執行緒事件佇列等候處理。

JS事件循環機制(Event loop)

Javascript有一個main thread 主程序和call-stack(一個呼叫堆疊),在對一個呼叫堆疊中的task處理的時候,其他的都要等著。當在執行過程中遇到一些類似setTimeout等非同步操作的時候,會交給瀏覽器的其他模組(以webkit為例,是webcore模組)進行處理,當到達setTimeout指定的延時執行的時間之後, task(回呼函數)會放入到任務佇列之中。一般不同的非同步任務的回呼函數會放入不同的任務佇列之中。等到呼叫堆疊中所有task執行完畢之後,接著去執行任務佇列之中的task(回呼函數)。

在上圖中,呼叫堆疊中遇到DOM操作、ajax請求以及setTimeout等WebAPIs的時候就會交給瀏覽器核心的其他模組進行處理,webkit核心在Javasctipt執行引擎之外,有一個重要的模組是webcore模組。圖中WebAPIs提到的三種API,webcore分別提供了DOM Binding、network、timer模組來處理底層實作。等到這些模組處理完這些操作的時候將回呼函數放入任務佇列中,之後等棧中的task執行完之後再去執行任務佇列之中的回呼函數。

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

關於js中類型轉換的一些小問題

JS中的隱含型別轉換

以上是單線程JS與多線程瀏覽器的使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn