close

每個JavaScript環境有一個全局對象,當你在任意的函數外面使用 this 的時候可以訪問到。你創建的每一個變數都成了這個全局對象的屬性。在瀏覽器中,方便起見,該全局對象有個附加屬性叫做window,此window(通常)指向該全局對象本身。下面的代碼片段顯示了如何在瀏覽器環境中創建和訪問的全局變量:

var myglobal = "hello";//宣告變數,而 window.myglobal , window["myglobal"] , this.myglobal 都是指 myglobal


JavaScript通過函數管理作用域。在函數內宣告的變數只可在這個函數內使用,函數外面不可用,反之,全域變數就是在任何函數外面宣告的或是 在任何地方未宣告直接簡單使用的。當程序的兩個不同部分定義同名但不同作用的全局變量的時候,命名衝突在所難免,所以應該盡量少用全域變數。這裡要注意, 只有在函數內用 var 宣告才是區域變數,其餘的都會當做全域變數

var aa = 1; // 全域變數
bb = 2; // 全域變數 , 不推薦
function () {
   var cc = 3; //區域變數
   dd = 4; // 全域變數 , 不推薦
}


常犯的錯誤

function foo() {
   var a = b = 0; // 等同於 var a = (b = 0);
   // ...
}

這樣的寫法 , 無疑 a 是區域變數 , 但 b 沒有被宣告 , 所以 b 是全域變數 , 跟想像中不一樣吧!!
下面的寫法就好多了

function foo() {
   var a, b;
   a = b = 0; // 兩個都是區域變數
}


另一個疑問 - 全域變數有沒有宣告都一樣嗎?

隱式全域變數和明確定義的全域變數間有些小的差異,就是通過 delete 指令讓變量未定義的能力。

  • 通過 var 創建的全局變量(任何函數之外的程序中創建)是不能被刪除的。
  • 無 var 創建的隱式全局變量(無視是否在函數中創建)是能被刪除的。


這表明,在技術上,隱式全域變數並不是真正的全域變數,但它們是全局對象的屬性。屬性是可以通過 delete 指令刪除的,而變數是不能刪除的。

// 定義三個全局變量
var global_var = 1;
global_novar = 2; //  全域變數 , 不推薦
(function () {
   global_fromfunc = 3; //  全域變數 , 不推薦
}());

// 是否為全局對象的屬性
console.log("global_var : " + Object.prototype.hasOwnProperty.call(this, "global_var"));// true
console.log("global_novar : " + Object.prototype.hasOwnProperty.call(this, "global_novar"));// true
console.log("global_fromfunc : " + Object.prototype.hasOwnProperty.call(this, "global_fromfunc"));// true

// 試圖刪除
console.log("delete global_var : " + delete global_var); // false
console.log("delete global_novar : " + delete global_novar); // true
console.log("delete global_fromfunc : " + delete global_fromfunc); // true

// 測試該刪除
console.log("typeof global_var : " + typeof global_var); // "number"
console.log("typeof global_novar : " + typeof global_novar); // "undefined"
console.log("typeof global_fromfunc : " + typeof global_fromfunc); // "undefined"

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 vivian 的頭像
    vivian

    VIVI。愛胡扯

    vivian 發表在 痞客邦 留言(0) 人氣()