簡單點說,Web Worker就是一個運行在背景的JavaScript線程,不會影響頁面的回應。
我們知道,JavaScript是單執行緒的腳本語言,也就是同一時刻只能做一件事情,否則會帶來極為複雜的同步問題。例如JavaScript同時有兩個線程,一個線程負責為某個DOM節點添加內容,另一個線程刪除這個節點,這時,瀏覽器要以哪個線程為主呢?
所以,為了避免同步複雜性的問題,JavaScript從一誕生起就是單線程,這也是這門語言的特徵。
JavaScript的單執行緒機制會帶來一個問題,當有一些非常複雜的任務需要處理時,頁面必須等待任務處理完成才能回應使用者的操作,這對於頁面的回應及使用者體驗都會帶來一些負面的影響,為了解決這個問題,同時也是為了利用多核心CPU的運算能力,HTML5提出了Web Worker標準,允許JavaScript創建多個線程,但是新創建的這些線程將作為子線程並且完全受主線程的控制。且不得操作DOM,其實本質上還是單線程。 所以,我們可以把一些費時的任務交給Web Worker創建的子執行緒在後台完成,而前台頁面依然可以處理使用者的回應。
由於Web Worker創建的線程是受限的子線程,所以會有一些使用限制:
#Web Worker無法存取DOM節點;
Web Worker無法存取全域變數或是全域函數;
Web Worker無法呼叫alert()或confirm之類的函數;
Web Worker無法存取window、document之類的瀏覽器全域變數;
不過Web Worker中的Javascript依然可以使用setTimeout(),setInterval()之類別的函數,也可以使用XMLHttpRequest物件來做Ajax通訊。
目前所有主流瀏覽器均支援 web worker,除了 Internet Explorer。
熟悉Angular的朋友應該都很清楚,Angular1最被大家詬病就是它的髒檢查機制,當scope的資料量過多時會嚴重影響效能。而Angular2正是藉助WebWorker來把繁重的運算工作移入輔助線程,讓介面線程不受影響。
以上是運行在背景的JavaScript執行緒--Web Worker的詳細內容。更多資訊請關注PHP中文網其他相關文章!