var リダイレクト 3

この文書は翻訳中です。他国語のままの部分などがあるのはその為です。
是非お気軽に MDN に登録して翻訳に参加し、私たちの手助けをして下さい!

概要

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

バージョン情報

実装されたバージョン JavaScript 1.0, NES 2.0
ECMAScript エディション ECMA-262

構文

var varname1 [=value1][, varname2 [=value2]][, ...][, varnameN [=valueN]]; 

パラメータ

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!

参照

Document Tags and Contributors

Contributors to this page: ethertank
最終更新者: ethertank,