首页 > 解决方案 > 尽管处于不同的功能中,为什么它会陷入无限循环?

问题描述

我正在尝试打印两个给定数字(num1num2)之间的所有素数。如果我在isPrime函数的 for 循环中使用不同的变量名,那将按预期工作。但是在使用相同的变量名时,i它会进入无限循环。为什么会这样?

下面是我的代码:

showPrimeNumbers();

function showPrimeNumbers(){
    var num1 = 10;
    var num2 = 15;
    for (i=num1; i<=num2; i++){
        if(isPrime(i)){
            console.log(i+" is a prime number.");
        }
    }
}

function isPrime(num){
    var flag = true;
    for (i=2;i<=num-1;i++){
        if(num%i == 0){
            flag=false;
            break;
        }
    }
    return flag;
}

标签: javascriptscope

解决方案


i的 s 没有varlet在它们前面,因此它们都引用(并隐式分配给)相同的全局变量。因此,每次isPrime运行时,i都会重置为 3 或 4,重复 - 它永远不会达到 15。

永远不要隐式分配给全局变量。而是放在slet前面。i

其他可能使代码更清晰的东西,而不是有一个flag可能被重新分配的变量,就是简单地return falsereturn true

showPrimeNumbers();

function showPrimeNumbers(){
    var num1 = 10;
    var num2 = 15;
    for (let i=num1; i<=num2; i++){
        if(isPrime(i)){
            console.log(i+" is a prime number.");
        }
    }
}

function isPrime(num){
    for (let i=2;i<=num-1;i++){
        if(num%i == 0){
            return false;
        }
    }
    return true;
}


推荐阅读