[英]Is 'window' always on top of the scope chain in javascript?
我已經看到了用window.global_name定義的全局變量。 我想知道,即使此腳本將以閉包方式運行,為什么不僅僅使用global_name。
UPD :當您在閉包內部聲明它時,似乎IE並未將其顯式添加到window對象中
在任何ECMAScript環境中,作用域鏈上的最后一個對象始終是全局對象 。 在瀏覽器中, window
是所有意圖和目的的全局對象。 如果要訪問全局對象x
或全局變量x
的屬性(幾乎但不是完全相同),則應使用window.x
進行顯式限定,以避免x
可能被解析為的屬性。作用域鏈上的另一個對象;如果您關心到非瀏覽器環境的可移植性, globalObj.x
。 您可以從ECMAScript 3或非嚴格ECMAScript 5中的任何位置獲取對全局對象的引用,如下所示:
var globalObj = (function() { return this; })();
如果當前或先前的范圍中可能還有另一個x
,則window.x
比簡單的x
更安全。 話雖如此,即使window
也不是萬無一失的,因為您可以定義一個名為window
的變量。
它們具有相似的效果,但是使用window
可以顯式聲明您正在故意使用全局變量。 否則,讀者將不知道它是否是作用域鏈上方的var
,您只是忘了聲明它,等等。
除非你介紹另一個范圍,例如,通過包裝你的代碼的功能, window === this === <the global scope>
然而, window
和this
有,你可以使用數組語法(優勢window['something']
),因此即使您僅在字符串中擁有全局名稱,也可以使用全局名稱,而無需使用諸如eval
之類的邪惡事物。
答案是肯定的 。 如果聲明的變量不帶var
關鍵字(在函數內部),則該變量將隱式成為window
對象的成員,該對象將由瀏覽器自動初始化。
在函數外部,無論是否帶有var
關鍵字,該變量都隱式地成為window
對象的成員。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.