我正在尝试打印两个给定数字(num1
和num2
(之间的所有素数。如果我在函数的 for 循环中使用不同的变量名isPrime
则按预期工作。但是,当使用与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
前面没有var
或let
,因此它们都引用(并隐式分配给(相同的全局变量。因此,每次运行isPrime
时,i
都会重置为 3 或 4,重复 - 它永远不会达到 15。
切勿隐式分配给全局变量。改为将let
放在i
前面。
其他可能使代码更清晰一些的东西,而不是可能重新分配的flag
变量,是简单地return 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;
}
您没有使用var
.这意味着JavaScript向上搜索嵌套的局部变量,直到它找到一个变量i
,如果找不到,它会创建一个全局变量。这意味着这两个函数共享变量i
。
通过在每个函数中的某处编写var i;
来修复它。
将来,请考虑通过在每个函数体的开头编写"use strict"
来使用严格模式。它使这些类型的错误更容易发现。
您的问题是您在循环中声明了没有var
关键字的i
变量,因此它将是window
范围内的全局变量。
所以两个函数都会访问同一个i
变量,并且两个函数会同时更新它,所以isPrime()
会将i
变量重置为2
,并且它不会高于4
,所以你的第一个for
循环的退出条件不会得到满足,因为i<=num2
将始终保持true
, 这就是你得到无限循环的原因。
只需在每个循环中声明它时使用var
,因此您将处理两个单独的变量,其中每个变量都是不同函数范围的局部变量。
for (var i=num1; i<=num2; i++)
和:
for (var i=2;i<=num-1;i++)