mozilla
Your Search Results

    var

    変数を宣言し、任意でそれをある値に初期化します。

    構文

    var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]];
    varnameN
    変数名。任意の有効な識別子。
    valueN
    変数の初期値。任意の有効な式。

    説明

    変数のスコープは現在の関数です。関数の外で宣言された変数はグローバルスコープとして、グローバルオブジェクト (global object) に紐付けられます

    関数の外での var の使用はオプションです。宣言されていない変数への値の代入は、暗黙的にそれをグローバル変数として宣言します(グローバルオブジェクト (global object) のプロパティになります)。違いは、宣言した変数はグローバルオブジェクトの設定変更不可プロパティになります、宣言していない変数は設定変更可能です。

    var a = 1;
    b = 2;
    
    delete this.a; // strictモードではTypeErrorをスローします。 そうでなければ静かに失敗します。
    delete this.b;
    
    console.log(a, b); // ReferenceErrorをスローします。 グローバルオブジェクトにプロパティbはなく、bは変数ではありません。
    

    結論として、関数スコープかグローバルスコープかにかかわらず、常に変数を宣言することをお勧めします。

    これらの場合、変数宣言に失敗し予期しない結果につながる可能性が高いです。このため、ECMAScript 5の Strict モードでは関数内で宣言していない変数に値を代入するとエラーをスローします。

    varの巻き上げ(hoisting)

    JavaScriptでは、使用した後に変数を宣言できます。

    bla = 2
    var bla;
    // ...
    
    // 次のように見なされます
    
    var bla;
    bla = 2;
    

    このため、変数は常に関数の先頭で宣言することをお勧めします。そうしない場合、次の例のような混乱を招く可能性があります。

    var cells = document.getElementsByTagName('td');
    
    for(var i=0; i<cells.length; i++){
      var cell = cells[i];
      cell.addEventListener('click', function(){
        cell.style.backgroundColor = '#00F'; // どの cell でしょうか?
      }, false);
    }
    

    ループ内のローカルなcellを捕捉することを意図していますが、実際には以下のことが起きています。

    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);
    }
    

    イベントリスナーが捕捉したcellはグローバル変数です。ループ終了時にループで辿った最後のcellが入ります。その結果、どのcellをクリックしても最後のセルを変更します。

    二つの変数を宣言して初期化する

    var a = 0, b = 0;
    

    二つの変数に一つの文字列を代入する

    var a = "A";
    var b = a;
    
    // 以下と等価です
    
    var a, b = a = "A";
    

    Be mindful of the order:

    var x = y, y = 'A';
    console.log(x + y); // undefinedA
    
    // Here, x is declared. y declaration (but not initialisation!) is hoisted
    // so, at the time of "x = y", y is declared (no ReferenceError is thrown) and its value is 'undefined'
    // then, y is assigned its value.
    // Consequently, after the first line, x === undefined && y === 'A'. Hence the concatenation
    

    Be careful of initialization of several variables:

    var x = 0;
    
    function f(){
      var x = y = 1; // x is declared locally. y is not!
    }
    f();
    
    console.log(x, y); // 0, 1
    // x is the global one as expected
    // y leaked outside of the function, though!
    

    参照

    ドキュメントのタグと貢献者

    タグ: 
    Contributors to this page: Potappo, teoli, ethertank, Mgjbot, Nanto vi, ledsun
    最終更新者: teoli,
    サイドバーを隠す