意外的无限循环

Unexpected infinite loop

本文关键字:无限循环 意外      更新时间:2023-09-26

这段代码是为无穷大而运行的,为什么?

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

如果n=2该函数不应执行任何操作如果n等于2,则函数调用f(0)和f(1),因此在此之后应该停止但只有当你运行它时,你才能得到无限循环。

有人能说出原因吗?

编辑:函数之外没有任何内容。

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

您可以通过更改来修复它

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++
...

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

因为在i=0的情况下一直得到f(i)。所以,当你在做一个循环时,你将不确定地做f(0)!(每个i都一样)只需在你的i上加一个var就可以停止你的循环

你能试试吗,i=0是全局变量,f(i)每次都会和全局变量一起设置值,所以每次都需要使用var i=0;来初始化i

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

每次调用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变量。