Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript函数有时会将自身循环成一个无限循环_Javascript_Function_Loops - Fatal编程技术网

Javascript函数有时会将自身循环成一个无限循环

Javascript函数有时会将自身循环成一个无限循环,javascript,function,loops,Javascript,Function,Loops,我已经做了一个while函数,它在大约一半的时间内都能正常工作。有时,虽然它根本不会加载函数,或者在加载函数的下一部分时遇到了卡滞,无法执行它的一个循环。就我所见,语法没有问题,但我对Javascript还是新手。我看不到代码中有任何地方会让自己认为自己陷入了无限循环。这是我的代码,如果你能帮忙的话,那就太棒了 var dragHunt = true; var hitOrMiss = Math.floor(Math.random() * 2); var dmgOnHit = 0; var t

我已经做了一个while函数,它在大约一半的时间内都能正常工作。有时,虽然它根本不会加载函数,或者在加载函数的下一部分时遇到了卡滞,无法执行它的一个循环。就我所见,语法没有问题,但我对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);
        }
    }

}

}我知道你的问题出在哪里了。您创建了一个无限循环,因为hitOrMissDraghtorMiss总是false。因此,基本上,如果DraghtorMiss实际上是一个常数,仅在顶部计算,那么dragHunt永远不会改变。如果它是假的,赫托密斯变成了假的,它们将永远不会被重新计算。 当它们都为假时,您有:

dragHunt = true;
while(dragHunt) {
  if (false) { 
     // not executed
  else if (false) {
     // not executed
  }
}
这就是你无尽的循环

如果DraghtorMiss在顶部被计算为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和DraghtorMiss值不再在dragHunt循环之前声明,但实际上是在使用前声明和计算的。

hitOrMiss
DraghtorMiss
都为false时,问题似乎就出现了。因此,代码所做的是,它生成hitOrMiss和DraghtorMiss作为常量,因为它们只计算一次。我该如何解决这一问题。您需要在使用hitOrMiss值后重新计算(拖动)hitOrMiss值,或者在使用之前生成hitOrMiss值。我将更新我的答案以证明这一点。