我見過用window.global_name定義的全局變量。 我想知道爲什麼不直接使用global_name,即使這個腳本將在閉包中運行。「窗口」總是在JavaScript範圍鏈的頂部?
UPD:好像IE不明確將其添加到窗口對象,當你把它聲明封閉
我見過用window.global_name定義的全局變量。 我想知道爲什麼不直接使用global_name,即使這個腳本將在閉包中運行。「窗口」總是在JavaScript範圍鏈的頂部?
UPD:好像IE不明確將其添加到窗口對象,當你把它聲明封閉
他們有類似的效果,但window
讓你的內部明確聲明,你是故意使用全球。否則,讀者不知道它是否是var
在範圍鏈的更上方,你只是忘記了聲明它等。
除非你引入另一個範圍,通過在功能包裝你的代碼,window === this === <the global scope>
然而,window
和this
有,你可以使用數組語法(window['something']
),這樣你就可以訪問全局變量,即使你有他們的名字只在一個字符串,而無需使用像eval
惡事的優勢。
window.x
比簡單地x
安全,如果可能存在可能是另一個x
在當前或前面的作用域。話雖如此,即使window
不是傻瓜證明,因爲你可以定義一個名爲window
的變量。
您不能在Firefox或Chrome中重新聲明'window'。 – 2011-04-06 18:23:49
@Matthew Flaschen:'function x(){var window = 10;警報(窗口); } x(); FF4中的'alerts'10'。 – casablanca 2011-04-06 19:48:50
對不起,你是對的;您可以在更局部的範圍內重新聲明它。但是,你不能在全球範圍內這樣做。 – 2011-04-06 20:05:47
答案是是。如果聲明瞭一個沒有var
關鍵字(在函數內)的變量,該變量將隱式成爲window
對象的成員,該對象將自動由瀏覽器初始化。
外部的功能,具有或不具有var
關鍵字,變量隱含變爲window
對象的成員。
任何ECMAScript環境中作用域鏈上的最後一個對象始終是全局對象。在瀏覽器中,window
是所有意圖和目的的全球對象。如果要訪問全局對象x
或全局變量x
(它們幾乎但不完全相同)的屬性,則應該明確地使用window.x
來限定它,以避免可能將x
解析爲另一個對象的屬性在範圍鏈上,或globalObj.x
,如果你關心的是對非瀏覽器環境的可移植性。您可以從任何地方ECMAScript中3個非嚴格的ECMAScript 5到全局對象的引用如下:
var globalObj = (function() { return this; })();
只要是肛門,窗口並不總是在JavaScript中的作用域鏈的頂端。例如,在服務器端的Node應用程序中,根本沒有窗口。 – 2011-04-06 18:46:40
這是正確的:) – noxvile 2011-04-06 18:48:07
事件更多的肛門然後:只有在DOM腳本(即:文檔對象模型中的JavaScript,實際上是瀏覽器)窗口位於作用域鏈的頂部。 Javascript/Ecmascript可以在很多(無窗口)環境中運行 – KooiInc 2011-04-06 19:10:55