2015-06-09 40 views
3

我不明白的7,8,9線:什麼是「自我」關鍵字意味着WebWorkers

var worker = new Worker('doWork.js'); 

worker.addEventListener('message', function(e) { 
    console.log('Worker said: ', e.data); // Here it send's the data. 
}, false); 

worker.postMessage('Hello World'); // Send data to our worker. 



//7 self.addEventListener('message', function(e) { 
    //8 self.postMessage(e.data); 
    //9 }, false); 

什麼做的代碼塊? 1.哪行代碼行觸發了第7行的消息事件? 2.第8行的postMessage中傳遞了哪些數據? 3.自己在這裏做什麼?

+0

「自我」可能是指一個對象(「本」),然而,它可能是在匿名函數的範圍內,所以他們可能曾用「自我」,而不是.bind()方法。你可以發佈其餘的代碼嗎?我敢肯定,還有更多。 –

+0

它是web工作者對[全局對象](https://developer.mozilla.org/en-US/docs/Web/API/WorkerGlobalScope/self)的引用,因爲它們沒有瀏覽上下文,也沒有'window'目的。 – Teemu

+0

@JoshBeam我自己也想過同樣的事情,事實證明這是另一個世界。請參閱http://www.html5rocks.com/en/tutorials/workers/basics/ –

回答

5

關鍵字self用於處理Worker的API,這意味着無論範圍(即使它是封閉的),您都可以訪問Worker的API(我不確定您是否可以將self重新聲明爲某種東西否則,並釋放Worker的API參考,但我相信它受JS保護,因此您無法覆蓋它)。

和下面的行:

self.addEventListener('message', function(e) { 
    self.postMessage(e.data); 
}, false); 

被簡單地添加事件偵聽器'message'事件,這將從事件發送數據返回到它被催生了webworker的上下文中的參考(最常見的是當前瀏覽器線程或父級工作者)。我們可以引述一下false布爾決定:

useCapture可選如果屬實,將useCapture指示用戶希望 開始捕獲了。在啓動捕獲之後, 指定類型的所有事件將被分派到註冊的偵聽器,然後 被分派到DOM樹下的任何EventTarget。事件 在樹中向上冒泡不會觸發指定使用捕獲的偵聽器 。請參閱DOM Level 3事件和JavaScript事件 以獲得詳細解釋。如果未指定,則useCapture 默認爲false。

注意:對於事件監聽器附加的事件 target;該事件處於目標階段,而不是捕獲和冒泡階段。不管useCapture參數如何,目標階段的事件都會觸發元素上的所有偵聽器 。

注意:useCapture 僅在主要瀏覽器的更新版本中才可選;例如,在Firefox 6之前,它不是可選的。您應該爲 提供此參數以實現最廣泛的兼容性。

wantsUntrusted如果爲true,偵聽器將接收的Web內容(默認是假的鍍鉻和普通網頁真 )派出合成事件 。此參數僅在Gecko中可用,並且 主要用於附加軟件中的代碼和瀏覽器本身。請參閱 示例的特權和非特權頁面之間的交互。

來源:https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener

關鍵字self的技術性描述:

自只讀WorkerGlobalScope接口的屬性返回 到WorkerGlobalScope自身的引用。大多數情況下,它是 特定範圍,如DedicatedWorkerGlobalScope, SharedWorkerGlobalScope或ServiceWorkerGlobalScope。

引自:https://developer.mozilla.org/en-US/docs/Web/API/WorkerGlobalScope/self

+0

感謝您的回答taxicala! –

+0

沒問題。樂意效勞 :) – taxicala