Javascript:递归+ for循环+作用域

Javascript: recursion + for loop + scope

本文关键字:循环 作用域 for Javascript 递归      更新时间:2023-09-26

在过去的几天里,我一直试图解决这个问题,但直到现在我还没有找到一个解决方案。

下面的代码递归地查找图上的路径。而不是输出nodePath的四个节点,它似乎输出'一个nodePath'与一个新添加的节点从每个周期(导致路径从1到200+节点增量)。递归路径调用似乎不会创建一个新的'nodePath',但是它会与邻居[node_nw]和depth一起创建。

var startNode = s.graph.nodes('n0');
var emptyNodeRoute = [];
path(startNode, 0, emptyNodeRoute);
function path (node, depth, nodePath) {
  nodePath.push(node);
  if (depth == 3) {
    printPath (nodePath);
  } else {
    depth ++;
    var neighbors = s.graph.neighbors(node.id);
    for (var node_nw in neighbors) {
      (function() {   
        path (neighbors[node_nw], depth, nodePath);
      }());
    }
  }
}
//prints node route
function printPath (nodePath) {
  var str = '';
  for(var k = 0; k < nodePath.length;  k++) {
    str = str.concat(' ', nodePath[k].label);
  }
  console.log ('nodePath: ' + str);
}

我猜这与javascript的特异性有关(没有)块作用域,闭包和递归?或者是我忽略的一些小事?我参考了一些资源(在http://zef.me/2843/javascript-the-scope-pitfall中)和这个网站上的主题,但没有一个能让我解决这个问题。

任何帮助都将非常感激!

这不是作用域、闭包或递归问题,而是引用问题

始终使用相同的nodePath引用调用path函数。复制nodePath变量,一切工作如预期。

这里是你需要改变的:

for (var node_nw in neighbors) {
   // the method slice makes a copy of the array
   path (neighbors[node_nw], depth, nodePath.slice());
}

看一下jsFiddle演示