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