用于嵌套注释的递归 javascript

d3w*_*abe 1 javascript recursion

我正在尝试递归循环嵌套评论数据,例如......

-parent comment a
----child comment a
--------grandchild comment a
----child comment b
-parent comment b
Run Code Online (Sandbox Code Playgroud)

这是我在 javascript 中所做的概述......

loadChildComments(commentdata[i].comment_id); //for every parent comment I make this call to load children

function loadChildComments(parentId){

  for (k=0; k<commentdata.length; k++) { //loop through the same data set looking for child comments
    if (commentdata[k].immediate_parent_id == parentId) {
      //we've found a child comment

      //bunch of steps to add the child comment to the page

      ///just finished adding a child comment so loop through to see if that child itself has children
      loadChildComments(commentdata[k].comment_id); //also tried arguments.callee(commentdata[k].comment_id);

    }
  }
  return true;
}
Run Code Online (Sandbox Code Playgroud)

如果我最后没有将递归回调添加到 loadChildComments() 中,我会正确地得到......

-parent comment a
----child comment a
----child comment b
-parent comment b
Run Code Online (Sandbox Code Playgroud)

但是当我确实包含回调时,我得到了这个......

-parent comment a
----child comment a
--------grandchild comment a
-parent comment b
Run Code Online (Sandbox Code Playgroud)

(缺少“儿童评论 b”)

所以看来递归调用正在工作,但是当 javascript 完成递归调用时并没有恢复到之前的位置?

很确定我错过了关于 javascript 中递归循环工作方式的一些基本知识,但在做了一些研究并尝试了各种解决方案但无济于事之后,我不知道会发生什么。感谢您的任何想法!

jfr*_*d00 5

为了使递归像这样工作,必须将k变量声明为局部变量。否则,它是一个隐式全局变量,并且对函数的每次递归调用都会覆盖调用者正在使用的该变量的值,因此当您从递归调用返回时,父调用者中的值k已被破坏,并且其循环无法执行以下操作应该如此。请参阅此处var添加到k定义中的内容:

loadChildComments(commentdata[i].comment_id); //for every parent comment I make this call to load children

function loadChildComments(parentId){

  // <== Add var in front of k=0 in line below
  for (var k=0; k<commentdata.length; k++) { //loop through the same data set looking for child comments
    if (commentdata[k].immediate_parent_id == parentId) {
      //we've found a child comment

      //bunch of steps to add the child comment to the page

      ///just finished adding a child comment so loop through to see if that child itself has children
      loadChildComments(commentdata[k].comment_id); //also tried arguments.callee(commentdata[k].comment_id);

    }
  }
  return true;
}
Run Code Online (Sandbox Code Playgroud)

如果您在严格模式下运行代码,那么这种类型的错误将是一个错误,运行时会立即向您指出。隐式全局变量(当你未能声明变量时)是 Javascript 的一个坏特性。使用严格模式来防止它们。