影响父方法变量的递归调用

Recursive call affecting parent method variables?

本文关键字:递归 调用 变量 方法 影响      更新时间:2023-09-26

我正在构建嵌套注释。我的AJAX脚本得到一个如下的评论列表,并将它们展开-

    if (xmlhttp.readyState == 4 || myOb.readyState == "complete")   {
        // EVAL
        var comments = eval('(' + xmlhttp.responseText + ')');
        // POPULATE
        var comm = "<ul>";
        for(i = 0; i < comments.length; i++)    {               
            if(comments[i].replyto == 0)    {
                comm = comm + expand(property, comments, i);
            }
        }
        comm = comm + "</ul>";
        // DISPLAY
        document.getElementById("comments").innerHTML = comm;
    }

这里,expand函数是递归的,并且似乎引起了麻烦-

function expand(property, comments, k)  {
    var comm = "";
    // PRINT MAIN COMMENTS
    comm = comm + "<li>";
        // print otherparent comment data
        // replies
        comm = comm + "<ul>";
        for(i = 0; i < comments.length; i++)    {
            // is a reply?
            if(comments[i].replyto == comments[k].id)   {
                comm = comm + expand(property, comments, i);
            }
        }
        comm = comm + "</ul>";
    comm = comm + "</li>";
    return comm;
}

这个脚本最终只给了我第一个comments数组元素(以及它各自的子注释)。但是,如果我删除递归代码,我就不会面临这个问题(同样,我也不会没有得到任何子评论)。。

function expand(property, comments, k)  {
    var comm = "";
    // PRINT MAIN COMMENTS
    comm = comm + "<li>";
        // print otherparent comment data
        // replies
        comm = comm + "<ul>";
        /*
        for(i = 0; i < comments.length; i++)    {
            // is a reply?
            if(comments[i].replyto == comments[k].id)   {
                comm = comm + expand(property, comments, i);
            }
        }
        */
        comm = comm + "</ul>";
    comm = comm + "</li>";
    return comm;
}

我在eval函数中设置了两个警报,在expand调用前后各一个:

        for(i = 0; i < comments.length; i++)    {               
            if(comments[i].replyto == 0)    {
                alert(i);
                comm = comm + expand(property, comments, i);
                alert(i);
            }
        }

两者都给了我不同的CCD_ 5值。我做错了什么?

感谢

您忘记将"i"设为局部变量:

    for(var i = 0; i < comments.length; i++)    {               

这是非常重要的。