2012-12-21 132 views
0

我正在创建一个网页,它将查找数字的主要因式分解。我使用的函数在一个循环内调用它自己。在我自己执行函数之后,循环的索引从它从第二次调用到达的索引改变。它应该返回数组中的所有素数因子。这是代码。当函数调用自己时,Javascript变量发生更改

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.有没有一种方法,使循环的当前索引不会被改变第二次调用函数?

+1

'var'不是可选的! – epascarello

回答

3

你真的应该使用var所有的变量,除非你特别希望他们是全球性的。 var使变量本地执行上下文,在这种情况下功能pf。如果没有它,所有变量都是全局变量,如果您在浏览器中运行该变量,则可能在window上下文中。

我怀疑你的问题发生,因为max和/或count是全球性的。

var max = Math.floor(Math.sqrt(number));

for(var count=2;count<=max;count++){

+0

谢谢。我想这是我从来没有打字过的变种。 – Bob

1

的变量在你的函数都是所谓的全局变量。这意味着他们可以(也将会)从脚本中的任何地方进行更改。你的功能完成后,它们也会保留它们的值。所以他们在每个函数调用中有不同的初始值。

要保留函数中的变量,必须将它们定义为本地变量。第一次定义变量时,可以使用关键字var来完成。

只要写

function pf (num) { 
    var max = ... 
    var factors = ... 

等。

这是更好,更干净的方式,并帮助您避免此类错误。

相关问题