2011-04-06 100 views
1

我見過用window.global_name定義的全局變量。 我想知道爲什麼不直接使用global_name,即使這個腳本將在閉包中運行。「窗口」總是在JavaScript範圍鏈的頂部?

UPD:好像IE不明確將其添加到窗口對象,當你把它聲明封閉

+3

只要是肛門,窗口並不總是在JavaScript中的作用域鏈的頂端。例如,在服務器端的Node應用程序中,根本沒有窗口。 – 2011-04-06 18:46:40

+0

這是正確的:) – noxvile 2011-04-06 18:48:07

+0

事件更多的肛門然後:只有在DOM腳本(即:文檔對象模型中的JavaScript,實際上是瀏覽器)窗口位於作用域鏈的頂部。 Javascript/Ecmascript可以在很多(無窗口)環境中運行 – KooiInc 2011-04-06 19:10:55

回答

0

他們有類似的效果,但window讓你的內部明確聲明,你是故意使用全球。否則,讀者不知道它是否是var在範圍鏈的更上方,你只是忘記了聲明它等。

0

除非你引入另一個範圍,通過在功能包裝你的代碼,window === this === <the global scope> 然而,windowthis有,你可以使用數組語法(window['something']),這樣你就可以訪問全局變量,即使你有他們的名字只在一個字符串,而無需使用像eval惡事的優勢。

1

window.x比簡單地x安全,如果可能存在可能是另一個x在當前或前面的作用域。話雖如此,即使window不是傻瓜證明,因爲你可以定義一個名爲window的變量。

+1

您不能在Firefox或Chrome中重新聲明'window'。 – 2011-04-06 18:23:49

+1

@Matthew Flaschen:'function x(){var window = 10;警報(窗口); } x(); FF4中的'alerts'10'。 – casablanca 2011-04-06 19:48:50

+0

對不起,你是對的;您可以在更局部的範圍內重新聲明它。但是,你不能在全球範圍內這樣做。 – 2011-04-06 20:05:47

0

答案是。如果聲明瞭一個沒有var關鍵字(在函數內)的變量,該變量將隱式成爲window對象的成員,該對象將自動由瀏覽器初始化。

外部的功能,具有或不具有var關鍵字,變量隱含變爲window對象的成員。

2

任何ECMAScript環境中作用域鏈上的最後一個對象始終是全局對象。在瀏覽器中,window是所有意圖和目的的全球對象。如果要訪問全局對象x或全局變量x(它們幾乎但不完全相同)的屬性,則應該明確地使用window.x來限定它,以避免可能將x解析爲另一個對象的屬性在範圍鏈上,或globalObj.x,如果你關心的是對非瀏覽器環境的可移植性。您可以從任何地方ECMAScript中3個非嚴格的ECMAScript 5到全局對象的引用如下:

var globalObj = (function() { return this; })();