此代码针对无限运行,为什么?
function f(n){
i=0;
if (n==2){
while(i<2){
f(i);
i++;
}
}
}
如果n!= 2,该函数应该什么都不做 如果n等于2,则函数调用f(0)和f(1),因此它应该在此之后停止 但是当你运行它时,你只会得到无限循环。
任何人都可以说出原因?
编辑:该功能以外没有任何内容。
并且不需要更好的代码。只是问为什么。
答案 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
变量。