[英]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.