意外的无限循环

时间:2013-12-16 19:57:07

标签: javascript infinite-loop

此代码针对无限运行,为什么?

    function f(n){
        i=0;
        if (n==2){
            while(i<2){
                f(i);
                i++;
            }
        }
    }

如果n!= 2,该函数应该什么都不做 如果n等于2,则函数调用f(0)和f(1),因此它应该在此之后停止 但是当你运行它时,你只会得到无限循环。

任何人都可以说出原因?

编辑:该功能以外没有任何内容。

并且不需要更好的代码。只是问为什么。

5 个答案:

答案 0 :(得分:7)

您可以通过更改

来修复它
i=0;

var i=0;

您的i变量是全局的(或至少其范围在f的外部,因此它由函数的所有调用共享)。当n最初为2时,您进入循环,此循环始终在增量之前将i重置为0。因此,您拥有的序列是

i = 0 // start of f
// enters loop for the first time with f(0)
i = 0 // start of f
i = 1 // i++
i <2 so loop again
i = 0 // start of f
i = 1 // i++
i <2 so loop again
i = 0 // start of f
i = 1 // i++
i <2 so loop again
i = 0 // start of f
i = 1 // i++
i <2 so loop again
i = 0 // start of f
i = 1 // i++
...

答案 1 :(得分:2)

i是全球性的。使用var声明它,以使其保持为每个实例的本地。否则,它会不断重置为0,因此您的while循环永远不会结束。

答案 2 :(得分:1)

因为你总是得到f(i)i = 0.所以当你做一个循环时,你将无限期地做f(0)! (每个我都一样)只需在你的i上放一个var来阻止你的循环

答案 3 :(得分:1)

你可以尝试这个吗,i=0是全局变量,f(i)每次和Global变量一起设置值的原因,所以你需要使用var i=0;来初始化{每次{1}}。

i

答案 4 :(得分:0)

每次调用f()时,i都会重新设置为0。由于您没有var i = 0,这意味着i是全局的!每次调用f()时,都会使用相同的i

当您致电f(2)时,您开始while循环。每次拨打f(i)时,您都会将i重新设置为0。所以while循环永远不会结束。

您需要i本地:

function f(n){
    var i=0;
    if (n==2){
        while(i<2){
            f(i);
            i++;
        }
    }
}

这样,每次调用f()时,都会创建自己的i变量。