web-dev-qa-db-ja.com

JavaScript変数の再宣言

this チュートリアルには次のように書かれています:

If you redeclare a JavaScript variable, it will not lose its value.

なぜ変数を再宣言する必要があるのですか?状況によっては実用的ですか?

ありがとうございました

41
xralf

これを行うと、次のことに注意してください。

var x=5;
var x;
alert(x);

結果は5になります

たとえば、他のいくつかの言語で変数を再宣言すると、結果は未定義またはNaNになりますが、JavaScriptにはありません。

52
ThatGuy

変数の再宣言の例は Google Analytics にあります。 JavaScriptトラッキングコードがGoogle Analyticsスクリプトによって開始されると、次のように_gaqを宣言または再宣言します。

var _gaq = _gaq || [];

つまり、_gaqがすでに定義されている場合、_gaqはそれ自体として「再宣言」されます。定義されていない場合は、空の配列として初めて宣言されます。

これにより、Google Analyticsトラッキングコードは、Google Analyticsコードが開始される前に変数を使用する必要がある他のスクリプトをサポートできます。 @xralfが指摘したように、JavaScriptではこれが可能です。

変数の再宣言は、変数がすでに定義されているかどうかがわからない場合に役立ちます。

変数を条件付きで再宣言することにより、Googleアナリティクスのトラッキングコードと同様に、変数を複数の場所から安全に生成できます。

この例では、_gaq変数を使用する他のコードが、事前定義された_gaq変数を同様にチェックすることが安全である可能性があります。存在する場合は、使用できることがわかります。存在しない場合は、使用する前に定義する必要があります。

38
Steve Oliver

なぜ変数を再宣言する必要があるのですか?

すべきではない。混乱を招くコードになります。

状況によっては実用的ですか?

番号。

19
Quentin

JavaScriptにはブロックスコープがないため、説明のために変数を再宣言することをお勧めします。これにより、コードが改善されます。

例えば:

for (var x=0; x< 100; x++) { }

alert(x); //In most languages, x would be out of scope here.
          //In javascript, x is still in scope.


//redeclaring a variable helps with clarification: 
var x = "hello";
alert(x);
7

巻上げであるため、値が失われません

var x = 5;
var x;

// this is same as

var x; // undefined;
x = 5;

したがって、「JavaScript変数を再宣言しても、その値は失われません。」

巻き上げに従って、宣言、それらすべてが一番上に移動します。 そして変数が割り当てられます

var x = 25;
var x; // redeclare first time
var x; // redeclare second time

// is same as 

var x; // undefined
var x; // Not sure if this happens, but doesn't make a difference, it's still undefined
x = 25;

実用性に関しては、時々起こります。 @steveoliverの答えを見てください。

3
roro

varで宣言された変数のみが再宣言できることに注意してください。 letまたはconstで宣言された変数を再宣言しようとすると(これは、現在ほとんどの場合に使用する必要があるES2015 Javascript構文です)、値を失うよりもさらに悪いのはerrorがスローされます:

let foo = 'foo';
let foo;

したがって、最新のJavascript構文を使用するコードベースでは、変数を再宣言することは単に不可能です。インタープリターは、単一ポイントを識別できる必要がありますletまたはconst変数が適切に初期化されるコード内。その時点より前は、変数名は 一時的なデッドゾーン に存在します。

2

一般に、巻き上げの問題( ここを参照 )のため、他のステートメントの後にvarを割り当てるのは悪いスタイルと考えることができます。 「単一変数パターン」( ここを参照 )を使用すると、再宣言はSteve OliverのGoogle分析の例のようにのみ発生する可能性があります。上記の例を次のようにリファクタリングします。

var x, max = 100; // no further var declarations afterwards!

for (x = 0; x < max; x++) { }

alert(x);

// redeclaration 'var x = "hello"' doesn't make any sense here
// and would be complained about by JSLint/-Hint 
x = 'hello';
alert(x);

ただし、オプションのパラメーターにデフォルト値を使用する場合は、再宣言が理にかなっています(これは、Googleアナリティクスの例がそうであると思います)。

function abc(param1) {
  var param1 = param1 || 'default value';
}
0
Felix