2012-08-14 129 views
0

我有一個while循環一樣的部份:while循環奇怪的行爲

var running_time = 0; 
var start_time = new Date(); 
while(cars.length > 0) 
{ 
    this.update(null, running_time) 
    for(var i in cars) 
    { 
     var car = cars[i]; 
     car.delay = 0; 
     car.update(start_time, this) 
    } 

    for(var i in cars_to_remove) 
    { 
     var index = cars.indexOf(cars_to_remove[i]); 
     if(index > -1) 
     { 
      cars.splice(index, 1); 
     } 
    } 
    cars_to_remove.splice(0, cars_to_remove.length); 
    running_time++; 
} 
var end_time = new Date(); 

我在做什麼在這裏,我正在模擬汽車運動和交通燈的動畫。循環運行,直到所有車輛到達目的地當汽車到達目的地時被標記爲從汽車陣列中移除(參見第二循環)。

當我在while循環中使用斷點調試while循環時,running_time變量通常在90左右,但是當我在while循環中沒有斷點時,並且在上例中的最後一行上設置斷點時,running_time的值變數更多(約12000)。

抓到哪裏?

回答

0

您不會將成品車推向cars_to_remove陣列。 (或者它是從顯示的代碼中丟失的?)

您是否在用於更新動畫的函數中使用setTimeout/setInterval? 如果在更新汽車位置時涉及超時,那麼當您在斷點上進行調試和等待時所進行的迭代將少於正常執行。

通常這必須通過以下任一方式完成。

方法1(僞碼)

while(condition){ 
    calculatePosition(); 
    updatePosition(); 
} 

function updatePosition(){ 
    if(condition){ 
     marktoRemove(); 
    }else{ 
     setTimeout(function(){ 
      updateDisplay(); 
     }, delay); 
     delay += 100; // for e.g. 
    } 
} 

方法2(僞碼) - While循環

setTimeout(function(){ 

    calculatePosition(); 

    if(condition){ 
     marktoRemove(); 
    }else{ 
     updateDisplay(); 
    }  

}, delay); 

建議沒有第二種方法。