意外的无限循环
Unexpected infinite loop
这段代码是为无穷大而运行的,为什么?
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
变量。
相关文章:
- 使用滚动溢出-x进行无限循环
- 从index.html调用函数,该函数无限循环
- 使用jQuery无限循环播放HTML页面幻灯片
- Grunt任务没有加载,获得无限循环
- 如何在不进入无限循环的情况下将网站重定向到Facebook画布URL
- Backbone+RequireJS+Mediator模式导致视图逻辑短路和无限循环
- jQuery无限循环,动画化许多项目
- 如何避免试图用php+jquery显示php起始页的无限循环
- 6502仿真增强型基本无限循环$C000至$E0ED
- Angular ngRoute导致无限循环和堆栈溢出
- Jquery:无限循环和暂停
- 数组数组:无限循环
- MeteorJS使用流星调用和流星方法时的无限循环
- 如何无限循环数据集字符串
- jquery在无限循环中运行
- 遍历对象会导致无限循环
- 为什么内部Javascript循环会阻止外部循环中断(即无限循环)
- 角度编译指令似乎进入了无限循环
- 意外的无限循环
- Reactjs意外无限循环渲染