繁体   English   中英

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

[英]Javascript: recursion + for loop + scope

在过去的几天里,我一直试图解决此问题,但是直到现在,我仍无法找到解决方案。

下面的代码递归地找到图上的路径。 似乎没有输出带有四个节点的nodePath,而是从每个周期输出带有一个新添加的节点的“一个nodePath”(导致路径从1到200+个节点递增)。 递归路径调用似乎并没有创建一个新的“ nodePath”,但是它使用了neighbors [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演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM