为什么尽管功能不同,但它却处于无限循环中?

  • 本文关键字:无限循环 功能 javascript scope
  • 更新时间 :
  • 英文 :


我正在尝试打印两个给定数字(num1num2(之间的所有素数。如果我在函数的 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前面没有varlet,因此它们都引用(并隐式分配给(相同的全局变量。因此,每次运行isPrime时,i都会重置为 3 或 4,重复 - 它永远不会达到 15。

切勿隐式分配给全局变量。改为将let放在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;
}

您没有使用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++)

最新更新