Javascript For循环被函数调用中断?

时间:2015-12-06 05:13:23

标签: javascript loops for-loop

我有一个for循环终止而没有完成循环。这似乎与在循环中是否调用另一个函数有关。

this.cycle = function() {
    var list = this.getBreaches("Uncontained");
    if (list.length > 0) {
        for (i=0; i < list.length; i++) {
           this.saveVsRupture(DC=11, i);   //calls this.rupture() if save failed
    }}
    return 1;
};

this.saveVsRupture()调用一个滚动d20并检查结果的函数。如果保存失败,它会调用一个名为this.rupture()的方法,该方法会对此进行一些调整。

问题 如果保存投掷成功,则循环继续,但如果保存投掷失败,则运行this.rupture()函数,然后中断for循环。它应该继续运行for循环。

为什么会这样?

其他详细信息 以下是其他功能......

    savingThrow = function(DC=11) {
    // DC = Difficulty Check on a d20   
    try {
        if (0 <= DC) {      
            var roll = Math.floor((Math.random() * 20))+1;  //roll d20
            var msg = "(Rolled "+roll+" vs DC "+DC+")";
            console.log(msg);       
            if (roll >= DC) {   //Saved
                return true;
            }
            else {  //Failed save
                return false;
            }
        }
    }
    catch(e) {
        console.log("Exception in savingThrow: "+e);        
    };
  };

    this.saveVsRupture = function(DC=1, i=null) {
    try {
        if (!savingThrow(DC)) {
            this.rupture(i);
            return false;
        }
        return true;
    }
    catch(e) {
        console.log(e);         
        }   
};


    this.rupture = function(i=null) {
    if (i == null) {
        i = range(1,this.damageList.length).sample();       
    }
    var hole = this.damageList[i];
    var dmg = range(1,this.harmonics()).sample();
    hole.rupture(dmg);
    msg = "*ALERT* " + hole + " expanded by " + dmg + "% Hull Integrity @"+this.hullIntegrity();
    this.log(msg);
    if (hole.size % 10 == 0) {
        this.health -= 25;
        msg = "The ship creaks ominously.";
        this.log(msg); 
    }
    return 1;
};  

3 个答案:

答案 0 :(得分:0)

更改saveVsRupture函数,如下所示:

function saveVsRupture(a,b) {
    try{
        //your saveVsRupture code here...
    }
    catch(e){}
}

您应该通过try,catch块来捕获代码中出现的问题,以防止将它们抛到代码的顶层(本例中的浏览器)。

不要在for for循环中使用return!

更改您的代码如下:

this.cycle = function() {
    var list = this.getBreaches("Uncontained");
    if (list.length > 0) {
        for (i=0; i < list.length; i++) {
            var temp = this.saveVsRupture(DC=11, i);   //calls this.rupture() if save failed
            console.log(temp);
        }}
    return 1;
};

答案 1 :(得分:0)

考虑在try循环中实施catch - for,并在try内使用saveVsRupture函数。此实现将捕获函数中的错误,但允许程序继续运行。

答案 2 :(得分:0)

for-loop的正确语法声明了计数器变量。

    for (var i=0; i < list.length; i++) {etc..

    /// Causes the For-Loop to exit prematurely...
    for (i=0; i < list.length; i++) {etc..

一旦&#34; var i = 0&#34;使用时,for循环按预期运行。