全局 DOM 變數 你可能已經知道,聲明一個全局變數(使用 var 或者不使用)的結果並不僅僅是創建一個全局變數,而且還會在 global 對象(在瀏覽器中為 window )中創建一個同名屬性。 還有一個不太為人所知的事實是:由於瀏覽器演進的歷史遺留問題,在創建帶有 id 屬性的 DOM 元素時也 ...
全局 DOM 變數
你可能已經知道,聲明一個全局變數(使用 var 或者不使用)的結果並不僅僅是創建一個全局變數,而且還會在 global 對象(在瀏覽器中為 window )中創建一個同名屬性。
還有一個不太為人所知的事實是:由於瀏覽器演進的歷史遺留問題,在創建帶有 id 屬性的 DOM 元素時也會創建同名的全局變數。例如:
<div id="foo"></div>
以及:
if (typeof foo == "undefined") {
foo = 42; // 永遠也不會運行
}
console.log( foo ); // HTML元素
你可能認為只有 JavaScript代碼才能創建全局變數,並且習慣使用 typeof 或 .. in window來檢測全局變數。但是如上例所示,HTML頁面中的內容也會產生全局變數,並且稍不註意就很容易讓全局變數檢查錯誤百出。
這也是儘量不要使用全局變數的一個原因。如果確實要用,也要確保變數名的唯一性,從而避免與其他地方的變數產生衝突,包括 HTML 和其他第三方代碼。
Firefox
初始化時,window並沒有屬性foo.但在第一次訪問這個屬性的時候(通過window.foo屬性直接訪問或者通過全局變數foo來訪問都可以),它會被自動建立.