而循环奇怪的行为

时间:2012-08-14 18:31:47

标签: javascript html html5 loops

我有一个类似的循环:

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)。

捕获的地方在哪里?

1 个答案:

答案 0 :(得分:0)

您没有将完成的汽车推到cars_to_remove阵列。 (或者它只是从显示的代码中丢失了?)

您是否在更新动画的函数中使用setTimeout / setInterval? 如果在更新汽车位置时涉及超时,则在调试和等待断点时进行的迭代将少于正常执行。

通常必须通过以下任一方式完成此操作。

Method1 (伪代码)

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

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

Method2 (伪代码) - No While循环

setTimeout(function(){

    calculatePosition();

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

}, delay);

建议使用第二种方法。