趁着夜深人靜睡不着來探究探究worker,那什麼是worker呢?jquery
worker是一種異步執行js的方式。字面意思是工人的意思,你們都知道js有一個基本特性就是單線程,從上到下依次執行:好比瀏覽器沒法同時運行兩個事件處理程序,它也沒法在一個事件處理程序運行的時候觸發一個計時器。之因此設計成單線程的理論是就是,客戶端的JavaScript函數必須不能運行時間太長:不然會致使循環事件,web瀏覽器沒法對用戶做出響應。這也是爲何ajax的API都是異步的,以及爲何客戶端JavaScript不能使用一個簡單的異步load()函數或者require()函數來加載JavaScript庫。web
建立一個workerajax
var worker = new Worker("index.js");
worker是一個輔線程,那怎麼跟主線程通訊呢?worker上有一個postMessage方法()跨域
var num = 1000; var worker = new Worker("index.js"); worker.postMessage(num);
在同一個域下index.js裏面能夠這樣接收數據瀏覽器
this.onmessage = function (e){ console.log(e); }
打印結果:網絡
worker的缺點dom
worker和主線程之間的通訊異步
一、postMessage(n)方法函數
二、onmessage()事件工具
結束worker
既然主人叫工人幹活,要是活幹很差,主人能夠辭退他
其餘的特性
一、worker只是window的子集,只能實現部分功能,不能獲取到window、document,因此這裏不要引jquery zepto。能夠引入一些計算類的庫。worker對象上定義最有意思的全局函數是importScript():worker使用此方法來加載任何須要的代碼庫。以下所示:
//在開始工做前先載入須要的類、工具函數 importScript("math.js","map.js","set.js");
importScript()方法能夠接受一個或者多個url參數,每一個url都指向一個JavaScript代碼文件。
二、做用域glob alWorkerScope chrom瀏覽器暫時不支持
在經過Worker()構造函數建立一個新的Worker的時候,指定了包含JavaScript代碼文件的url。該代碼會運行在全新的JavaScript運行環境中,跟主線程的環境隔離開來。globalWorkerScope全局對象表示了該worker新的運行環境。globalWorkerScope對象在某種程度上來講大於核心的JavaScript全局對象,小於整個客戶端的window對象。
postMessage跨域指的是window上的跨域
window.postMessage
主要應用於iframe子頁面傳遞數據給父頁面