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 中递归循环工作方式的一些基本知识,但在做了一些研究并尝试了各种解决方案但无济于事之后,我不知道会发生什么。感谢您的任何想法!
为了使递归像这样工作,必须将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 的一个坏特性。使用严格模式来防止它们。
| 归档时间: |
|
| 查看次数: |
2559 次 |
| 最近记录: |