mozilla
您的搜尋結果

    var

    摘要

    宣告一個變數, 同時可以非強制性地賦予一初始值。

    版本資訊

    說明
    實作於: JavaScript 1.0, NES 2.0
    ECMA 版本: ECMA-262

    語法

    var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]];

    參數

    varnameN
    變數名稱。可以是任何合法的識別字符 (identifier)。
    valueN
    變數的初始值。可以是任何合法的表示式 (expression)。

    說明

    以 var 宣告的變數, 其作用範圍 (scope) 及於該函數之內; 但是如果在函數外宣告, 其作用範圍則為全域性 (global) (亦即包納於全域物件之內)。

    在函數之外使用以 var 宣告的變數是非強制的 (optional); 如果對一個未經宣告的變數賦值, 它會被暗中 (implicitly) 宣告成為一個全域變數 (亦即成為全域物件的屬性)。其中差異在於, 已宣告的變數是全域物件裡的一個無法變更 (non-configurable) 的屬性, 而未宣告的變數則是可變更的 (configurable)。

    var a = 1;
    b = 2;
    
    delete this.a; // 若在 strict 模式下會出現 TypeError, 若不是, 則會無警告地 (silently) 失敗。
    delete this.b;
    
    console.log(a, b); // 丟出 ReferenceError。因為 'b' 屬性不存在於全域物件,
    // 'b' 已不再是個變數。
    

    因此, 建議你一定要宣告你的變數, 不管你要將它使用於全域範圍內或者函數內。

    若未宣告變數, 將非常可能導致無法預測的結果。所以, 在 ECMAScript 5 strict mode 中, 若在函數中給一個未經宣告的函數賦值, 將會丟出錯誤。

    var 提升 (hoisting)

    在 JavaScript 中, 變數可以先使用再宣告。

    bla = 2
    var bla;
    // ...
    
    // 會被自動解譯為:
    
    var bla;
    bla = 2;
    

    因此, 建議你永遠都把變數的宣告放在函數的最頂端。否則可能導致混亂的情況。

    var i, cell;
    var cells = document.getElementsByTagName('td');
    
    for(i=0; i<cells.length; i++){
      cell = cells[i];
      cell.addEventListener('click', function(){
        cell.style.backgroundColor = '#00F';
      }, false);
    }
    

    在以上範例中, 在 event listener 中取得的 'cell' 是那個全域變數的 'cell', 但是在迴圈結束時則會取得最尾端的那個 cell。結果, 不管你點擊哪個 cell, 都只會影響到最尾端的那個 cell。(譯註: 正確的寫法請參考 http://jsfiddle.net/JohnnyWorker/ULsqN/)

    範例

    宣告兩個變數並賦予初始值:

    var a = 0, b = 0;
    

    給兩個變數指定單一字串值。

    var a = "A";
    var b = a;
    
    // 相當於:
    
    var a, b = a = "A";
    

    請注意順序:

    var x = y, y = 'A';
    console.log(x + y); // undefinedA
    
    // 在這裡, x 為已宣告。而 y 的宣告 (不是初始化!) 會被自動提升
    // 因此, 當執行到 "x = y" 時, y 已經被宣告了 (不會擲回 ReferenceError), 其值為 'undefined'
    // 然後 y 的即被指定
    // 因此, 下一行變成 x === undefined 且 y === 'A', 經串加後傳回
    

    請注意以下幾個變數的初始化動作:

    var x = 0;
    
    function f(){
      var x = y = 1; // x 被宣告為區域變數, 而 y 不是!
    }
    f();
    
    console.log(x, y); // 0, 1
    // x 一如預期的是全域變數
    // 而 y 會被提升而溢出函數之外!
    

    參照

    Document Tags and Contributors

    Contributors to this page: Johnny.Net, teoli
    最近更新: teoli,