Javascript:递归+ for循环+作用域
Javascript: recursion + for loop + scope
在过去的几天里,我一直试图解决这个问题,但直到现在我还没有找到一个解决方案。
下面的代码递归地查找图上的路径。而不是输出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演示。
相关文章:
- JavaScript/循环混淆中的动态作用域与词法作用域
- for 循环中 setInterval 中计数器变量 i 的作用域
- 嵌套循环中 Javascript 变量的作用域
- 使用循环简化 AngularJS 作用域
- 在循环作用域中定义变量或应超出作用域
- 什么's是在JavaScript中的循环中定义的变量的作用域
- 滚动时启动的javascript对象中的作用域、计时器和循环
- 执行for循环将另一个对象添加到Javascript中的作用域链中
- 匿名函数中循环内的变量作用域
- For循环和变量作用域
- forEach循环中的JavaScript变量作用域
- for循环内变量的作用域
- 理解for循环中的JavaScript作用域
- 作用域上的Angular循环
- 在ng-repeat循环和双向数据绑定之外访问ng-repeat的子作用域
- 在Angular中将父作用域的值传递给ng-repeat循环
- 循环中的变量作用域
- Highcharts JSON调用的javascript关联数组、循环和/或作用域问题
- 在node.js的循环中调用回调函数的作用域问题
- Javascript:递归+ for循环+作用域