2010-09-03 36 views
29

我有一個JavaScript處理檢測頁面是否在框架中。我用top.frames []等等,一切正常。自我和窗戶有什麼區別?

在這個腳本中,我注意到我可以互換地使用「窗口」或「自我」,並且所有東西都能正常工作。在HTML頁面中使用時,「窗口」與「自我」相同嗎?

+6

使用Web Workers時自己和窗口不是一回事。參見[http://stackoverflow.com/questions/11219775/global-variable-in-web-worker][1] [1]:http://stackoverflow.com/questions/11219775/global - 在網絡工作者的變量 – user1872904 2014-06-02 13:45:17

回答

15

JavaScript權威指南

Window對象定義了一些 屬性和允許你 操縱Web瀏覽器窗口的方法。 它還定義了指向其他重要對象的屬性 ,例如 document屬性爲 Document對象。最後,窗口 對象具有兩個自引用 屬性,windowself。你可以使用全局變量 直接引用到Window對象,即 。

總之,windowself都是對Window對象的引用,它是客戶端JavaScript的全局對象。

+0

除FF6.0之外的necro-bug,http://stackoverflow.com/a/7769187/139361,'window'和'self'應該是相同的。任何人都知道任何其他錯誤? --------------------------------------- 我必須補充說,使用'self'對大多數JavaScript開發人員來說都很混亂,所以使用'window'代替。 – Dan 2014-01-16 10:17:32

8

下面是the MDN page for window.self說明和示例:

if (window.parent.frames[0] != window.self) { 
    // this window is not the first frame in the list 
} 

window.self在比較過程幾乎總是使用像在上面的例子中,其發現當前窗口是否是父框架集中的第一個子幀。

鑑於目前沒有人使用框架集,我認爲沒有必要考慮self沒有有用的情況。此外,至少在Firefox中,對window而不是window.self進行測試是等效的。

+0

對於需要獨立於瀏覽器運行的代碼,使用'self',即無頭執行似乎更好。 – nilskp 2013-06-04 14:22:18

+0

@nilskp,這很有趣,但我不理解你。你能解釋一下嗎? – Dan 2014-01-13 09:37:38

+0

@Dan,'window'只存在於GUI(瀏覽器)中。並非所有的Javascript代碼都在瀏覽器中運行。在這些情況下,'self'仍然可以工作,但'window'不會。 – nilskp 2014-01-13 21:15:34

6

self只讀屬性,可以比更靈活,並且有時支持,所述window直接使用。這是因爲self的參考值根據操作環境而變化(與window.self不同,只有存在window時才存在)。正如其他人所說的那樣,這也是比較好的選擇。

例如,如果您在Web Worker(位於其自己的後臺線程)內部使用selfself實際上會引用WorkerGlobalScope.self。但是,如果在正常的瀏覽器環境中使用self,則self只會返回對Window.self(具有document,addEventListener()以及您以前看過的所有其他內容)的引用。

TL; DR而在window.self.self不會,如果window不存在,存在於自己的意志點使用selfWindow.self在傳統的窗口/瀏覽器上下文,或在網絡工作者背景WorkerGlobalScope.self

像往常一樣,MDN在這個問題上有一個很好的writeup in their JavaScript docs:)


旁註:var self = this切換後維持到上下文的引用:self這裏的用法不應該與聲明的局部變量的共同JS模式相混淆。

你可以在這裏閱讀更多關於:Getting Out of Binding Situations in JavaScript