0

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

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。有没有办法使循环的当前索引不因函数的第二次调用而改变?

4

2 回答 2

3

var除非您特别希望它们是全局的,否则 您确实应该使用所有变量。var使变量成为执行上下文的局部变量,在本例中为函数pf. window没有它,你所有的变量都是全局的,如果你在浏览器中运行它,可能在上下文中。

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

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

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

于 2012-12-21T16:58:34.603 回答
1

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

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

写吧

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

等等。

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

于 2012-12-21T17:02:24.163 回答