函数调用时,Javascript变量会发生变化

时间:2012-12-21 16:56:39

标签: javascript recursion

我正在创建一个网页,可以找到数字的素数因子分解。我使用的函数在循环中调用自身。在我自己执行函数之后,循环的索引从它从第二次调用到达的索引改变。它应该返回数组中的所有素因子。这是代码。

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.是否有办法使循环的当前索引不会被第二次调用功能

2 个答案:

答案 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 = ...

等等。

这是更好,更清洁的方式,可以帮助您避免此类错误。