我正在创建一个网页,可以找到数字的素数因子分解。我使用的函数在循环中调用自身。在我自己执行函数之后,循环的索引从它从第二次调用到达的索引改变。它应该返回数组中的所有素因子。这是代码。
function pf(num){
max=Math.floor(Math.sqrt(number));
factors=[];
prime=true;
for(count=2;count<=max;count++){
ratio=num/count;
if(ratio%1==0){
alert(count);//HERE
factors=pf(ratio);
alert(count);//HERE
factors.push(count);
prime=false;
break;
}
}
if(prime){
factors.push(num);
}
return factors;
}
假设此代码以20的输入运行。第一个警报将显示数字2,但下一个将显示3.是否有办法使循环的当前索引不会被第二次调用功能
答案 0 :(得分:3)
除非您特别希望它们是全局变量,否则您应该将var
用于所有变量。 var
使变量成为执行上下文的本地变量,在本例中为函数pf
。没有它,所有变量都是全局的,如果你在浏览器中运行它,可能在window
上下文中。
我怀疑您的问题是因为max
和/或count
是全球性的。
做
var max = Math.floor(Math.sqrt(number));
和
for(var count=2;count<=max;count++){
答案 1 :(得分:1)
函数中的变量都是所谓的全局变量。这意味着他们可以(并且将会)从脚本中的任何位置进行更改。在函数完成后,它们也会保留它们的值。因此,每个函数调用都有不同的初始值。
要将变量保留在函数中,您需要将它们定义为本地变量。在第一次定义变量时,可以使用关键字var
来完成此操作。
只需写下
function pf ( num ) {
var max = ...
var factors = ...
等等。
这是更好,更清洁的方式,可以帮助您避免此类错误。