2010-05-09 60 views
5

爲什麼DOM有一個名爲self的對象,另一個名爲window的對象是什麼?爲了增加混亂window有一個屬性叫self這樣:爲什麼DOM既有窗口又有自我?

window === window.self === self 

爲什麼會這樣呢?我應該使用哪一個?

+0

爲什麼你需要參考? 'window'是DOM的一部分,而'self'與javascript中的全局對象有關,在大多數實現中恰好等於DOM的窗口。在像Rhino這樣的非瀏覽器實現中,'self'存在,但不存在'window',因爲沒有DOM。 – 2010-05-09 11:56:19

+0

@Sean:'self'不會出現在Javascript(ECMAScript)標準中。要在整個實現中通過名稱可靠地訪問全局對象,必須通過在全局上下文(在任何函數之外)執行類似下面的命令來自己命名:'var global = this;'因爲當控制進入全局上下文的代碼,'this'指向全局對象。 'self'作爲'window.self'上下文之外的全局對象的名稱沒有任何意義。 – 2010-05-09 12:02:28

+0

@ T.J即將添加相同的 – 2010-05-09 12:05:01

回答

5

self由JavaScript環境並指向[全球]對象定義(但不是規範的一部分,因此可能不存在),而window是DOM規範的一部分。 在大多數瀏覽器中,window被用作[global]對象,但事實並非如此。

self == window.self並不奇怪,因爲它們是相同的對象 - 當查找到self時,它被發現是全局對象(window)的一個屬性。所以它實際上與window.self == window.self一樣。

如其他地方所述,爲了可靠地引用[global]對象,您應該在全局執行上下文中通過運行var global = this;來將其定義爲sef。

+0

我知道這兩個都是指向同一個對象的指針。它讓我感到奇怪,DOM的一個對象本身就是一個屬性,因爲它不明顯,爲什麼有人會故意設計一些類似的東西。 – hekevintran 2010-05-09 12:09:58

+2

如果您知道執行上下文是在ECMAScript中構建的,則它並不奇怪。畢竟,「自我」屬性必須定義在某個可訪問的權利?這是作爲'[global]'對象本身的屬性。該屬性實際上指向'[global]'對象在這裏並不真正相關。 – 2010-05-09 12:12:32

+0

那麼你是說'self'就像'var global = this;'在全局執行上下文中一樣嗎?我想我的問題是:爲什麼'self'存在,如果瀏覽器給我們'window'? – hekevintran 2010-05-09 12:19:41

1

當你調用selfwindow.self,有這麼一回事像任何其他全局屬性(例如location真的window.location)。

它在那裏的原因是什麼?通常支票像這樣:

if(window.top != window.self) { 
    alert("We're in a frame"); 
} 
+0

@ T.J。如果'window.top'和'window.self'改變了類型,那麼你的JS有更大的問題:)至於第一次檢查,是的,你可以使用'window',但是'window.self!= window.top'是很多*清晰*是我的觀點:) – 2010-05-09 11:58:12

+1

Gotcha。 (和類型:是的,但是,嘿,它可能發生!'window.top =「frog」;';-)) – 2010-05-09 12:04:02

+1

@ T.J。哦,它肯定會發生:)老年人IE讓你重新定義'窗口'對象本身,好時光 – 2010-05-09 12:05:24

0

全球self是一個捷徑window.self。他們都是同一個對象。

至於爲什麼有windowself,在網頁上下文中,self總是等於window(據我所知)。但我想這不一定總是那樣 - Javascript/ECMAScript不限於在有DOM的網頁中使用。

至於要使用什麼,在正常的網頁上下文AFAIK中都應該是安全的。儘管如此,請參閱@ Nick的關於使用window的好論據的評論。

+1

我不會親自使用'self' ...許多框架/ misc代碼使用它作爲局部變量內部和可能在你正在餵食它,所以在某些情況下,'self'可能*不會''window.self'。 – 2010-05-09 12:03:38

+0

@尼克好點,編輯我的答案,以反映他們。 – 2010-05-09 12:04:33

相關問題