107

for-inJavaScript でループを記述する正しい方法は何ですか? ここで紹介する 2 つの方法のいずれについても、ブラウザーは文句を言いません。まず、反復変数xが明示的に宣言されているこのアプローチがあります。

for (var x in set) {
    ...
}

あるいは、より自然に読めるが、私には正しくないように見えるこのアプローチ:

for (x in set) {
    ...
}
4

10 に答える 10

111

を使用する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 ifor ループに書き込むと、アラートが表示されます2

JavaScript のスコープと巻き上げ

于 2011-04-19T13:36:48.843 に答える
41

最初のバージョン:

for (var x in set) {
    ...
}

というローカル変数を宣言しますx。2 番目のバージョン:

for (x in set) {
    ...
}

ではない。

xがすでにローカル変数である場合 (つまり、現在のスコープ (つまり現在の関数) のどこかにvar x;またはがある場合)、それらは同等になります。がまだローカル変数でないvar x = ...;場合、2 番目を使用すると暗黙的にグローバル変数が宣言されます。次のコードを検討してください。xx

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を警告すると予想するかもしれませんが、は 1 つの同じものであるため、, , there, ,を警告します。あなたはそれをしたくない !ループで使用します。copterxheytherethereheytheretherevar xfor

さらに言えば、forループがグローバル スコープ内にある (つまり、関数内にない) 場合、ローカル スコープ (xを使用する場合、スコープは で宣言されますvar x) はグローバル スコープと同じです (スコープxは で暗黙的に宣言されます)。 xvar なしで使用する場合)、2 つのバージョンは同じになります。

于 2011-04-19T13:39:44.100 に答える
25

var, alwaysでローカル変数を宣言する必要があります。

また、「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 プロトタイプに存在します。

于 2011-04-19T13:32:13.070 に答える
12

実際、見出し内の宣言forが気に入らない場合は、次のことができます。

var x;
for (x in set) {
    ...
}

この質問に対する他の回答で述べたように、まったく使用varしないと、グローバルプロパティの割り当てなどの不要な副作用が発生します。

于 2011-04-19T14:01:44.303 に答える
9

でループ変数を宣言するものを使用しますvar。暗黙的に宣言された変数には、おそらく意図したものとは異なるスコープがあります。

于 2011-04-19T13:30:43.447 に答える
6

を使用varするのが最もクリーンな方法ですが、両方ともここで説明されているように機能します: https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...in

基本的に、を使用varすることで、新しい変数を確実に作成できます。そうしないと、以前に定義した変数を誤って使用する可能性があります。

于 2011-04-19T13:30:26.957 に答える
4

var はパフォーマンス上の理由から良いと思います。

Javascript は、x が既に別の場所に存在するかどうかを確認するために、グローバル スコープ全体を調べません。

于 2011-04-19T13:31:36.940 に答える
3

一般的な観点から、最初のバージョンはループのスコープ内に存在する必要があるインデックス用であり、他のバージョンはループのコンストラクターが呼び出されたスコープ内の任意の変数です。

for ループ内でループのインデックスを使用する予定で、次の行でこれが必要とされない場合は、"var" を使用して変数を宣言することをお勧めします。これにより、"x" が 0 で初期化されたループのインデックスであることを確認できます。もう1つは、このコンテキストで他の「x」変数が使用可能な場合、これはループのインデックスによって上書きされます-つまり、いくつかの論理エラーが発生します-.

于 2011-04-19T13:33:08.670 に答える