回答:
を使用するvar
と、変数のスコープが縮小されます。それ以外の場合、変数はvar
ステートメントを検索する最も近いクロージャを検索します。が見つからない場合var
はグローバルです(厳密モードの場合using strict
、グローバル変数はエラーをスローします)。これにより、次のような問題が発生する可能性があります。
function f (){
for (i=0; i<5; i++);
}
var i = 2;
f ();
alert (i); //i == 5. i should be 2
var i
forループで書き込むと、警告が表示されます2
。
var
内部にfor
ヘッドを配置すると、forループでローカルのように見えますが、そうではありません。したがって、以下のuser422039のスタイルを使用します。
最初のバージョン:
for (var x in set) {
...
}
と呼ばれるローカル変数を宣言しますx
。2番目のバージョン:
for (x in set) {
...
}
ではない。
場合x
(あなたが持っている。すなわち、すでにローカル変数であるvar x;
か、var x = ...;
どこかそれ以前のあなたの現在のスコープ内(つまり、現在の関数))、その後、彼らは同等になります。がまだx
ローカル変数でない場合、2番目を使用すると、暗黙的にグローバル変数が宣言されますx
。このコードを考えてみましょう:
var obj1 = {hey: 10, there: 15};
var obj2 = {heli: 99, copter: 10};
function loop1() {
for (x in obj1) alert(x);
}
function loop2() {
for (x in obj2) {
loop1();
alert(x);
}
}
loop2();
アラートにこれを期待するかもしれないhey
、there
、heli
、hey
、there
、copter
、しかし、以来x
、それは警告する1と同じですhey
、there
、there
、hey
、there
、there
。あなたはそれを望まない!ループで使用var x
しますfor
。
それをすべてオフに先頭に次の場合for
ループはグローバルスコープ(すなわちない機能で)であり、その後、ローカルスコープは(スコープはx
、あなたが使用している場合に宣言されているvar x
)は、グローバルスコープと同じである(スコープはx
、暗黙的に宣言されていますx
varなしで使用する場合)、2つのバージョンは同じになります。
ローカル変数はvar
、常にで宣言する必要があります。
それがあなたがしたいことであることが確実である場合を除いて、「for ... in」ループを使用すべきではありません。実際の配列を反復する(これはかなり一般的です)には、常に数値インデックスを持つループを使用する必要があります。
for (var i = 0; i < array.length; ++i) {
var element = array[i];
// ...
}
「for ... in」を使用してプレーン配列を反復処理すると、ループが数値でインデックス付けされたもの以外の配列の属性を取得する可能性があるため、予期しない結果が生じる可能性があります。
編集 —ここ2015年には.forEach()
、配列を反復処理するために使用することもできます。
array.forEach(function(arrayElement, index, array) {
// first parameter is an element of the array
// second parameter is the index of the element in the array
// third parameter is the array itself
...
});
この.forEach()
メソッドは、IE9以降のArrayプロトタイプに存在します。
実際、for
見出し内の宣言が嫌いなら、次のようにすることができます。
var x;
for (x in set) {
...
}
この質問の他の回答で述べたように、まったく使用var
しないと、グローバルプロパティの割り当てなどの不要な副作用が生じます。
でループ変数を宣言したものを使用してくださいvar
。暗黙的に宣言された変数には、おそらく意図したものとは異なるスコープがあります。
for(var i = 0; ...)
よく見られるパターンですが、
for(int i; ...)
C ++では、変数のスコープはfor
ブロックではありません。実際、はvar
囲みスコープ(関数)の最上部に巻き上げられるため、ローカルi
はfor
ループの前(現在のスコープ/関数の開始後)とその後の両方で効果的に利用できます。
つまり、次のようにします。
(function(){ //beginning of your current scope;
//...
for(var i in obj) { ... };
})();
と同じです:
(function(){ //beginning of your current scope;
var i;
//...
for(i in obj) { ... };
})();
ES6には、スコープをforブロックに制限するlet
(の代わりにvar
)キーワードがあります。
もちろん、暗黙的なグローバルではなく、ローカル変数(var
or let
またはorで宣言されたものconst
(ES6の場合))を使用する必要があります。
for(i=0; ...)
または、(必要にfor(i in ...)
応じて)使用し、宣言されていない場合は失敗します。"use strict";
i
使用するのvar
が最もクリーンな方法ですが、どちらもここで説明するように機能します。https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...in
基本的に、を使用しvar
て、新しい変数を作成することを確認します。そうしないと、以前に定義した変数を誤って使用する可能性があります。
一般的な観点から、最初のバージョンはループのスコープ内に存在する必要があるインデックス用であり、もう1つはループのコンストラクターが呼び出されたスコープ内の任意の変数です。
forループ内でループのインデックスを使用する場合、次の行で他の人がこれを必要としない場合は、変数を「var」で宣言して、「x」が0で初期化されるループのインデックスであることを確認してください。もう1つは、このコンテキストで他の「x」変数が使用可能な場合、ループのインデックスによって上書きされます(論理エラーが発生します)。
var
イテレータを宣言するために使用されませんでしたi
:Uncaught ReferenceError: i is not defined
。したがって、これから使用します:/ webpackは「グローバル」変数を奇妙に扱います。詳細については、次を参照してください: stackoverflow.com/a/40416826