Javascript函数有时会将自身循环到无限循环中

时间:2016-03-06 23:00:11

标签: javascript function loops

我做了一个大约一半时间正常工作的函数。有时虽然它根本不会加载函数或卡住加载函数的下一部分执行其中一个循环。据我所知,语法没有任何问题,但我仍然是Javascript的新手。我无法在代码中的任何地方看到可能导致自己认为它陷入无限循环。那么这里是我的代码,如果你可以帮助那将是非常棒的。

var dragHunt = true; 
var hitOrMiss = Math.floor(Math.random() * 2); 
var dmgOnHit = 0;
var totalDmg = 0;
var playerHealth= 0;
var dragHitOrMiss = Math.floor(Math.random() * 1.5);
var dragDmg= 0;

while(dragHunt){
if(hitOrMiss){
    dmgOnHit = Math.floor(Math.random() * 5 + 1);
    alert("You hit the dragon, the luck is with you today. You did " + dmgOnHit + " damage!");
    totalDmg += dmgOnHit;

    if(totalDmg >= 20){
        alert("You did it! You have killed the dragon. The hunt was successful!");
        dragHunt=false;
    }
    else{
        hitOrMiss = Math.floor(Math.random() * 2);
    }
}
else{
    if(dragHitOrMiss){
        dragDmg = Math.floor(Math.random() * 5 + 1);
        alert("The Dragon hit you for " + dragDmg + " damage!");
        playerHealth += dragDmg;

        if(playerHealth >= 80){
            alert("The dragon has burnt you to a crisp. You stood no chance against the ferocious beast.");
            dragHunt=false;
        }
        else{
            hitOrMiss = Math.floor(Math.random() * 2);
        }
    }

}

}

2 个答案:

答案 0 :(得分:1)

我知道你的问题是什么。您创建了一个无限循环,因为 hitOrMiss 始终为false以及 dragHitOrMiss 。所以,基本上,dragHunt永远不会改变

答案 1 :(得分:0)

如果dragHitOrMiss实际上是常量,则仅在顶部计算。如果它为false,并且hitOrMiss变为false,则永远不会重新计算它们。 当它们都是假的时候,你有:

dragHunt = true;
while(dragHunt) {
  if (false) { 
     // not executed
  else if (false) {
     // not executed
  }
}

这是你的无限循环。

如果在顶部将dragHitOrMiss计算为true,则会在每次传递中重新计算hitOrMiss,这就是为什么有时只有无限循环。

编辑:您希望您的代码看起来更像这样:

while(dragHunt) {
    var hitOrMiss = Math.floor(Math.random() * 2);
    if (hitOrMiss) {
        // The player hit the dragon code here.
    } else {
        // The Player missed the dragon; it gets a chance to hit the player instead
        var dragHitOrMiss = Math.floor(Math.random() * 1.5);
        if (dragHitOrMiss) {
            // Dragon hit you code here.
        }
    }
}

每次检查玩家是否击中龙时,都会计算命中/未命中值。每次检查龙是否击中玩家时,您都会计算该击中/未命中值。请注意,hitOrMiss和dragHitOrMiss值不再在dragHunt循环之前声明,而是在使用之前实际声明和计算。