2017-09-04 61 views
0

爲什麼在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; 
} 

在檢查(),I循環通過包含22項所示由第一的console.log(elements.length)元素。如果我刪除方法filterMolecules(...),則會記錄所有22個ID。但是,對於代碼,僅記錄第一個ID。

我認爲應該運行elements.length次數的filterMolecules方法會導致outer for循環不起作用。有人能解釋爲什麼會發生這種情況嗎?如果相關,filterMolecules(...)會使用分子[i] .val()[參數]從Google Firebase中檢索數據。此外,這兩種方法使用全局變量的分子(第3行和第14行)

+0

'分子= filteredMolecules;'出現的第一個參數的值被設定爲'filterMolecules'功能。這是打算?雖然你不顯示它,但「check」函數中的代碼將表明「分子」也處於更高的範圍。 –

回答

2

當不聲明在JavaScript你最終使用全局(其可以是一個很難的bug點源)變量。因此,在這裏,您對兩個循環都使用相同的全局變量i。當您開始循環思考molecules時,您意外增加了第一個for的計數器循環。使用不同的變量與定義它們:

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

哪位能給每個環路自身i版本。

在這種情況下,由於聲明是各個功能的內部,可以使用var太:

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