JavaScript:无限循环,或者不是
JavaScript: infinite loop, or not?
在我的函数中,我在树中循环查找节点中的特定属性。该函数以递归方式调用,并在找到属性或树中没有更多节点时停止。
然而,当我运行这个函数时,它进入了我认为是无限循环的状态,Firefox冻结了,我不得不停止这个进程。然后我在函数中添加了一个setTimeout
,以确定是什么导致了问题,但是现在整个事情都正确运行了。如果有人对问题有一些见解,我将在这里发布函数(顺便说一句,我正在使用AngularJS并取消勾选复选框):
$scope.uncheckNode = function(nodeId, subitem){
// Loop through each node in the sub nodes
for (i = 0; i<subitem.length; i++){
// If the node is found, uncheck it and break from the loop
if (subitem[i].Id == nodeId){
subitem[i].selected = false;
break;
}
// Otherwise get the sub nodes of the subnodes
// (an empty array if undefined)
// Check if it has any nodes and continue with the recursion
else{
var subsubitem = subitem[i].Subitem || [];
if (subsubitem.length > 0){
$scope.uncheckNode(nodeId, subsubitem);
}
}
}
}
问题很可能是您正在使用全局i
变量。因为你没有声明它,你就成了的牺牲品。因此,当函数调用自身时,它将全局i
重置为0
。如果从属调用返回(因为没有子项),i
将是它在从属调用中的最后一个值。如果这个值小于调用代码中的值,你将永远循环。
要使i
成为一个局部变量,请在函数中添加一个var i
。
您可以考虑在代码的顶部添加"use strict"
来使用严格模式。在严格模式下,你不再有隐式全局变量,你有一个很好的清晰的ReferenceError
提醒你添加声明代替。
相关文章:
- 使用滚动溢出-x进行无限循环
- 从index.html调用函数,该函数无限循环
- 使用jQuery无限循环播放HTML页面幻灯片
- Grunt任务没有加载,获得无限循环
- 如何在不进入无限循环的情况下将网站重定向到Facebook画布URL
- Backbone+RequireJS+Mediator模式导致视图逻辑短路和无限循环
- jQuery无限循环,动画化许多项目
- 如何避免试图用php+jquery显示php起始页的无限循环
- 6502仿真增强型基本无限循环$C000至$E0ED
- Angular ngRoute导致无限循环和堆栈溢出
- Jquery:无限循环和暂停
- 数组数组:无限循环
- MeteorJS使用流星调用和流星方法时的无限循环
- 如何无限循环数据集字符串
- jquery在无限循环中运行
- 遍历对象会导致无限循环
- 为什么内部Javascript循环会阻止外部循环中断(即无限循环)
- 角度编译指令似乎进入了无限循环
- 显示随机数js的无限循环
- JavaScript:无限循环,或者不是