簡體   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