2017-09-04 10 views
0

forループはJavaScriptの早い段階で終了するのはなぜですか?何らかの理由で私の外側のforループが最初の繰り返しの後に終了します。私はJavaScriptを初めて使っていますが、このようなことはJavaで動くと期待しています。JavaScript for Loop早期破裂

function check(){ 
    var elements = document.getElementById('fields').children; 
    var filteredMolecules = molecules; 
    console.log(elements.length); 
    for (i = 0; i < elements.length; i++) { 
     console.log(elements[i].id) 
     filterMolecules(filteredMolecules, elements[i].id, 0, 10); 
    } 
} 

function filterMolecules(molecules, parameter, lower, upper){ 
    console.log('filtering'); 
    var filteredMolecules = []; 
    for (i=0;i<molecules.length;i++){ 
     var value = molecules[i].val()[parameter]; 
     filteredMolecules.push(molecules[i]); 
    } 
    molecules=filteredMolecules; 
} 

check()では、最初のconsole.log(elements.length)のように22個の要素を含む要素をループします。メソッドfilterMolecules(...)を削除すると、22個のIDがすべて記録されます。ただし、コードをそのまま使用すると、最初のIDだけが記録されます。

私はelements.length回数を実行するfilterMoleculesメソッドは、forループの外側を引き起こしていると考えています。誰かがなぜこれが起こっているのか説明してもらえますか?該当する場合は、filterMolecules(...)で、分子[i] .val()[パラメータ]を使用してGoogle Firebaseからデータを取得します。さらに、両方のメソッドはグローバル変数分子(3行目と14行目)を使用します。

+0

'分子=のfilteredMoleculesを;' 'filterMolecules'関数に最初のパラメータの値を設定しているように見えます。これは意図されていますか?あなたがそれを表示しない間、 'check'関数のコードは、'分子 'もより高いスコープで生きていることを示します。 –

答えて

2

JavaScriptで変数を宣言しないと、バグの原因を突き止めるのが難しいグローバルを使用することになります。ここでは、両方のループで同じグローバル変数iを使用しています。ループを開始すると、moleculesが最初のforのカウンタループを誤ってインクリメントしています。別の変数を使用は、それらを定義します。各ループにiの独自のバージョンを提供します

for (let i=0;i<molecules.length;i++) 

。この場合

、宣言は、個々の関数内なので、あなたもvarを使用することができます。

for (var i=0;i<molecules.length;i++) { 
// etc. 
}