隱式全局變量和明確定義的全局變量間有些小的差異,就是通過delete
操作符讓變量未定義的能力。
- 通過var創建的全局變量(任何函數之外的程序中創建)是不能被刪除的。
- 無var創建的隱式全局變量(無視是否在函數中創建)是能被刪除的。
這表明,在技術上,隱式全局變量並不是真正的全局變量,但它們是全局對象的屬性。屬性是可以通過delete
操作符刪除的,而變量是不能的:
// 定義三個全局變量 var global_var = 1; global_novar = 2; // 反面教材 (function () { global_fromfunc = 3; // 反面教材 }()); // 試圖刪除 delete global_var; // false delete global_novar; // true delete global_fromfunc; // true // 測試該刪除 typeof global_var; // "number" typeof global_novar; // "undefined" typeof global_fromfunc; // "undefined"
在瀏覽器中,全局對象可以通過window
屬性在代碼的任何位置訪問(除非你做了些比較出格的事情,像是聲明了一個名為window的局部變量)。但是在其他環境下,這個方便的屬性可能被叫做其他什么東西(甚至在程序中不可用)。如果你需要在沒有硬編碼的window
標識符下訪問全局對象,你可以在任何層級的函數作用域中做如下操作:
var global = (function () { return this; }());
這種方法可以隨時獲得全局對象,因為其在函數中被當做函數調用了(不是通過new
構造),this
總 是指向全局對象。實際上這個病不適用於ECMAScript 5嚴格模式,所以,在嚴格模式下時,你必須采取不同的形式。例如,你正在開發一個JavaScript庫,你可以將你的代碼包裹在一個即時函數中,然后從 全局作用域中,傳遞一個引用指向this作為你即時函數的參數。