2016-04-21 82 views
0

我已將代碼修剪至我認爲相關的部分。該功能在$(document).ready函數的開始處運行一次。爲什麼Javascript內部循環會阻止外部循環的斷開(即無限循環)?

var evenGaps = []; 
const NUMBERED_NEIGHBORS = //some array 
var evenLocations = //some array 
var gapNumber = 0; 

function gapFinder() { 
    for (var x = 0; x < NUMBERED_NEIGHBORS[evenLocations[i + 2]][1].length; x++) { 
    if (NUMBERED_NEIGHBORS[evenLocations[i]][1][p] === 
     NUMBERED_NEIGHBORS[evenLocations[i + 2]][1][x]) { 

     var delta0 = evenGaps[gapNumber]["1_Gap"][0] - evenGaps[gapNumber]["2_Filler"][0]; 
     var delta1 = evenGaps[gapNumber]["1_Gap"][1] - evenGaps[gapNumber]["2_Filler"][1]; 
     var delta = [delta0, delta1]; 

     evenGaps.push([]); 
     evenGaps[gapNumber]["5_Distance"] = Math.max(Math.abs(delta[0]), 
     Math.abs(delta[1])); 

     if (Math.abs(delta[0]) === Math.abs(delta[1])) { 
     evenGaps[gapNumber]["6_Single Path?"] = true; 
     } else { 
     evenGaps[gapNumber]["6_Single Path?"] = false; 
     }; 

     if (evenGaps[gapNumber]["6_Single Path?"] && 
     evenGaps[gapNumber]["5_Distance"] >= 2) { 

     //THE ISSUE ARISES WHEN THE LINE BELOW IS ADDED 
     for (var i = 0; i < evenGaps[gapNumber]["5_Distance"]; i++) {} 
     } 
     gapNumber++; 
    } 
    } 
} 

我能夠在Chrome中運行代碼時沒有問題,因爲它沒有包含最後一個for循環。即使我將它作爲一個空循環運行,仍然會出現無限循環,但是,它是拒絕中斷的外循環(我知道這一點,因爲我已將信息printint添加到內循環之上的控制檯)。這通常只發生在我快速重新加載頁面時。如果我刪除了那一行代碼,我可以在沒有問題的情況下儘可能快地重新加載它。當我嘗試在Firefox中運行它時,它似乎也進入了循環,但Firefox使用停止腳本對話框停止了它,但是它顯示了錯誤的腳本,因爲我說的for()循環導致了這個問題。

此外,我正在使用一個非常簡單的Node.js服務器。

+0

NUMBERED_NEIGHBORS [evenLocations [i + 2]] [1] .length'表達式中的'i'變量來自哪裏? – zerkms

回答

1

你在這個循環中使用的變量i

for (var x = 0; x < NUMBERED_NEIGHBORS[evenLocations[i + 2]][1].length; x++) { 

什麼樣的價值它正在取決於你的代碼的其餘部分;也許這是一個全球變量;也許它完全沒有定義 - 但是你的內部循環會改變這個值,影響外部循環的工作方式。

+0

現在要隱藏我的頭。我沒有提到這一點,但上面的代碼包含在另外兩個外部循環中,其中一個使用「i」作爲其計數器,這是您推斷的(很好的工作)。我改變了線上的計數器變量,它給了我一個問題,現在似乎工作。謝謝! – SuperCodeBrah