尽管功能不同,为什么它仍会无限循环?

时间:2018-07-06 06:52:54

标签: javascript scope

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

3 个答案:

答案 0 :(得分:2)

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

从不隐式分配全局变量。将let放在i前面。

让代码更清晰一些的事情,可能是简单地flagreturn false,而不是重新分配了return 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;
}

答案 1 :(得分:1)

您没有使用Traceback (most recent call last): File "C:\Users\Steven\Anaconda3\lib\site-packages\tornado\web.py", line 1543, in _execute result = yield result File "C:\Users\Steven\Anaconda3\lib\site-packages\tornado\gen.py", line 1099, in run value = future.result() File "C:\Users\Steven\Anaconda3\lib\site-packages\tornado\gen.py", line 1107, in run yielded = self.gen.throw(*exc_info) File "C:\Users\Steven\Anaconda3\lib\site-packages\notebook\services\sessions\handlers.py", line 73, in post type=mtype)) File "C:\Users\Steven\Anaconda3\lib\site-packages\tornado\gen.py", line 1099, in run value = future.result() File "C:\Users\Steven\Anaconda3\lib\site-packages\tornado\gen.py", line 1107, in run yielded = self.gen.throw(*exc_info) File "C:\Users\Steven\Anaconda3\lib\site-packages\notebook\services\sessions\sessionmanager.py", line 79, in create_session kernel_id = yield self.start_kernel_for_session(session_id, path, name, type, kernel_name) File "C:\Users\Steven\Anaconda3\lib\site-packages\tornado\gen.py", line 1099, in run value = future.result() File "C:\Users\Steven\Anaconda3\lib\site-packages\tornado\gen.py", line 1107, in run yielded = self.gen.throw(*exc_info) File "C:\Users\Steven\Anaconda3\lib\site-packages\notebook\services\sessions\sessionmanager.py", line 92, in start_kernel_for_session self.kernel_manager.start_kernel(path=kernel_path, kernel_name=kernel_name) File "C:\Users\Steven\Anaconda3\lib\site-packages\tornado\gen.py", line 1099, in run value = future.result() File "C:\Users\Steven\Anaconda3\lib\site-packages\tornado\gen.py", line 315, in wrapper yielded = next(result) File "C:\Users\Steven\Anaconda3\lib\site-packages\notebook\services\kernels\kernelmanager.py", line 148, in start_kernel super(MappingKernelManager, self).start_kernel(**kwargs) File "C:\Users\Steven\Anaconda3\lib\site-packages\jupyter_client\multikernelmanager.py", line 110, in start_kernel km.start_kernel(**kwargs) File "C:\Users\Steven\Anaconda3\lib\site-packages\jupyter_client\manager.py", line 259, in start_kernel **kw) File "C:\Users\Steven\Anaconda3\lib\site-packages\jupyter_client\manager.py", line 204, in _launch_kernel return launch_kernel(kernel_cmd, **kw) File "C:\Users\Steven\Anaconda3\lib\site-packages\jupyter_client\launcher.py", line 128, in launch_kernel proc = Popen(cmd, **kwargs) File "C:\Users\Steven\Anaconda3\lib\subprocess.py", line 709, in __init__ restore_signals, start_new_session) File "C:\Users\Steven\Anaconda3\lib\subprocess.py", line 997, in _execute_child startupinfo) FileNotFoundError: [WinError 2] The system cannot find the file specified 。这意味着JavaScript会在嵌套的本地语言中向上搜索,直到找到变量var;如果找不到变量,则会创建一个全局变量。这意味着这两个函数共享变量i

通过在每个函数的某个位置写入i来解决此问题。

将来,请考虑在每个函数体的开头编写var i;来使用严格模式。它使这类错误更容易发现。

答案 2 :(得分:0)

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

因此,两个函数都将访问相同的i变量,并且两个函数将同时对其进行更新,因此isPrime()会将i变量重置为{{1 }},且不会高于2,因此不会满足您的第一个4循环的退出条件,因为for将始终保持i<=num2,即为什么会有无限循环。

在每个循环中声明true时,只需使用它们,因此您将处理两个单独的变量,其中每个变量对于不同函数的作用域是局部的。

var

并且:

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