【问题标题】:Why it is going in an infinite loop despite being in different functions?尽管处于不同的功能中,为什么它会陷入无限循环?
【发布时间】:2018-07-06 06:52:53
【问题描述】:

我正在尝试打印两个给定数字(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;
}

【问题讨论】:

  • 你没有在两个函数中声明i,它是全局的,两个循环都被它的值弄乱了。
  • 因为i 是全球性的。在每个for 中单独声明它。所以,而不是for (ifor ( var i
  • 顺便说一句,你的 isPrime 函数可以稍微快一点 stackoverflow.com/questions/40200089/is-a-number-prime

标签: javascript scope


【解决方案1】:

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

永远不要隐式分配给全局变量。请将let 放在is 前面。

其他可能使代码更清晰的方法是简单地使用return falsereturn true,而不是使用可能重新分配的flag 变量:

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;
}

【讨论】:

    【解决方案2】:

    您没有使用var。这意味着 JavaScript 会向上和向上搜索嵌套的局部变量,直到找到变量 i,如果找不到,它会创建一个全局变量。这意味着两个函数共享变量i

    通过在每个函数的某处写入var i; 来修复它。

    以后考虑使用严格模式,在每个函数体的开头写"use strict"。它使这类错误更容易被发现。

    【讨论】:

      【解决方案3】:

      您的问题是您在循环中声明了没有var 关键字的i 变量,因此它将是window 范围内的全局变量。

      所以两个函数都将访问同一个i 变量,并且两个函数会同时更新它,所以isPrime() 会将i 变量重置为2,它不会高于4,因此不会满足第一个for 循环的退出条件,因为i&lt;=num2 将始终保持true,这就是你得到无限循环的原因。

      在每个循环中声明 var 时只需使用它,这样您将处理两个单独的变量,其中每个变量都是不同函数范围的本地变量。

      for (var i=num1; i<=num2; i++)
      

      还有:

      for (var i=2;i<=num-1;i++)
      

      【讨论】:

        猜你喜欢
        • 2019-12-23
        • 2021-05-16
        • 2010-11-01
        • 1970-01-01
        • 2019-03-03
        • 1970-01-01
        • 2020-07-13
        • 2023-03-22
        • 2016-04-08
        相关资源
        最近更新 更多