變量作用域(JavaScript)

JavaScript 有兩個範圍:全局和局部。  在函數定義之外聲明的變量是全局變量,它的值可在整個程序中訪問和修改。  在函數定義內聲明的變量是局部變量。  每當執行函數時,都會創建和銷燬該變量,且無法通過函數之外的任何代碼訪問該變量。  JavaScript 不支持塊範圍(通過一組大括號 {. . .} 定義新範圍),但塊範圍變量的特殊情況除外。 

JavaScript 中的範圍

雖然局部變量可具有與全局變量相同的名稱,但它是完全獨立的;更改一個變量的值不會影響另一個變量。  在聲明局部變量的函數中,僅局部版本具有意義。 
// Global definition of aCentaur.
var aCentaur = "a horse with rider,";

// A local aCentaur variable is declared in this function.
function antiquities(){

   var aCentaur = "A centaur is probably a mounted Scythian warrior";
}

antiquities();
aCentaur += " as seen from a distance by a naive innocent.";

document.write(aCentaur);

// Output: "a horse with rider, as seen from a distance by a naive innocent."

在 JavaScript 中,變量就像它們在所在範圍的開始被聲明一樣來計算。  有時,這會導致意外行爲,如此處所示。 
var aNumber = 100;
tweak();

function tweak(){

    // This prints "undefined", because aNumber is also defined locally below.
    document.write(aNumber);

    if (false)
    {
        var aNumber = 123;  
    }
}

當 JavaScript 執行一個函數時,它首先會查找所有變量聲明,例如 var someVariable;  它使用初始值 undefined 創建變量。  如果使用一個值聲明變量(例如 var someVariable = "something";),則該變量的初始值仍爲 undefined,並且僅當執行包含聲明的行時才採用已聲明的值。  

JavaScript 會在執行任何代碼之前處理所有變量聲明,無論是在條件塊中聲明還是在其他構造中聲明。  JavaScript 一旦找到所有變量,就會執行函數中的代碼。  如果在函數內部隱式聲明變量(即,該變量出現在賦值表達式的左側但尚未使用 var 進行聲明),則它將創建爲全局變量。  

在 JavaScript 中,內部(嵌套)函數將存儲對局部變量的引用(即使在函數返回之後),這些局部變量存在於與函數本身相同的範圍中。  這一組引用稱爲閉包。  在以下示例中,對內部函數的第二次調用所輸出的消息與第一次調用相同(“Hello Bill”),因爲外部函數的輸入參數 name 是存儲在內部函數閉包中的局部變量。 


function send(name) {
    // Local variable 'name' is stored in the closure
    // for the inner function.
    return function () {
        sendHi(name);
    }
}

function sendHi(msg) {
    console.log('Hello ' + msg);
}

//send('li');爲什麼不能直接調用函數send()呢?  解答:直接調用send()只是返回了sendHi()函數,再次運行纔會輸出結果。
var func = send('Bill');
func();
// Output:
// Hello Bill
sendHi('Pete');
// Output:
// Hello Pete
func();
// Output:
// Hello Bill

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章