簡單點說,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來把繁重的計算工作移入輔助線程,讓界面線程不受影響。
