2015-06-03 2 views
0

В моей функции я перебираю дерево в поисках определенного атрибута в узле. Функция называется рекурсивно и останавливается, когда атрибут найден или когда в дереве больше узлов.JavaScript: бесконечный цикл или нет?

Однако, когда я запускаю функцию, она переходит в то, что я предполагаю, это бесконечный цикл, 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); 
       } 
      } 
     } 
    } 
+0

Это будет бесконечно петля, если он никогда не найдет 'nodeId' в подэлементах. –

ответ

4

Проблемы, наиболее вероятно, что вы используете глобальный i переменная. Поскольку вы этого не заявили, вы становитесь жертвой The Horror of Implicit Globals. Поэтому, когда функция вызывает себя, она сбрасывает глобальные i на 0. Если подчиненный вызов возвращается (потому что нет подпунктов), i будет тем, что его последним значением было в подчиненном вызове. Если это меньше, чем в коде вызова, вы зацикливаетесь навсегда.

Чтобы сделать i локальной переменной, добавьте функцию var i.


Вы могли бы рассмотреть возможность использования строгого режима, добавив "use strict" в верхней части вашего кода. В строгом режиме у вас больше нет неявных глобалов, у вас есть хороший ясный ReferenceError, напоминающий вам вместо этого добавить декларацию.

+0

О, черт возьми, так просто, это сработало, спасибо. – Niel

Смежные вопросы