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
变量。因为您还没有声明它,所以您正在成为 The Horror of Implicit Globals 的猎物。因此,当函数调用自身时,它会将全局 i
重置为 0
。如果从属调用 returns(因为没有子项),i
将是它在从属调用中的最后一个值。如果它小于调用代码中的值,您将永远循环。
要使 i
成为局部变量,请向函数添加 var i
。
您可以考虑通过在代码顶部添加 "use strict"
来使用严格模式。在严格模式下,你不再有隐式全局变量,你有一个清晰的 ReferenceError
提醒你添加声明..
在我的函数中,我循环遍历树以查找节点中的特定属性。该函数被递归调用,并在找到属性或树中不再有节点时停止。
然而,当我 运行 函数进入我假设的无限循环时,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
变量。因为您还没有声明它,所以您正在成为 The Horror of Implicit Globals 的猎物。因此,当函数调用自身时,它会将全局 i
重置为 0
。如果从属调用 returns(因为没有子项),i
将是它在从属调用中的最后一个值。如果它小于调用代码中的值,您将永远循环。
要使 i
成为局部变量,请向函数添加 var i
。
您可以考虑通过在代码顶部添加 "use strict"
来使用严格模式。在严格模式下,你不再有隐式全局变量,你有一个清晰的 ReferenceError
提醒你添加声明..