JavaScript:无限循环,还是没有?

时间:2015-06-03 11:55:07

标签: javascript angularjs infinite-loop

在我的函数中,我循环遍历树,寻找节点中的特定属性。该函数以递归方式调用,并在找到属性时或树中没有更多节点时停止。

然而,当我运行该函数时,它进入我认为是无限循环,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);
                }
            }
        }
    } 

1 个答案:

答案 0 :(得分:4)

问题很可能是您正在使用全局i变量。因为你还没有宣布它,你就会成为 The Horror of Implicit Globals 的牺牲品。因此,当函数调用自身时,它会将全局i重置为0。如果从属调用返回(因为没有子项),i将是它在从属调用中的最后一个值。如果它比调用代码中的少,那么你将永远循环。

要使i成为局部变量,请在函数中添加var i

您可以考虑在代码顶部添加"use strict"来使用严格模式。在严格模式下,你不再拥有隐式全局变量,你有一个很好的明确ReferenceError提醒你添加声明..