【问题标题】:Return a variable from within a recursive Javascript function从递归 Javascript 函数中返回一个变量
【发布时间】:2013-10-10 08:54:09
【问题描述】:

我是一名 Javascript 新手,正在编写 Chrome 扩展程序。我想在特定文件夹中获取一组书签。我复制了一些爬取文件夹和书签树的代码,但是当我修改它以返回文件夹的内容时,它只爬取了树的一部分。

它使用 Chrome 书签 API。每个节点都有一个标题、URL 和一个子节点数组。 http://developer.chrome.com/extensions/bookmarks.html#type-BookmarkTreeNode

function findFolder(bookmarkNodes, folderName) {
    for(var i=0;i<bookmarkNodes.length;i++) {
        console.log(bookmarkNodes[i].title, bookmarkNodes[i].url ?
            bookmarkNodes[i].url : "[Folder]");


        /* (A) this crawls the whole tree successfully
        if(bookmarkTreeNodes[i].children) {
            traverseBookmarks(bookmarkTreeNodes[i].children);
        }
        */


        // (B) this stops at the first terminal branch
        if(bookmarkNodes[i].children) {
            if (bookmarkNodes[i].title == folderName) {
                return bookmarkNodes[i].children;
            }

            return findFolder(bookmarkNodes[i].children);
        } 

    }
}

运行注释代码 (A) 时,控制台输出会显示所有文件夹和书签。当代码 B 运行时,它只会到达没有子节点的第一个分支,并且不处理同级分支或父级的同级分支。控制台显示该分支的文件夹名称,以及其中的所有书签。

范围问题似乎是递归函数问题的根源,但我已经尝试过将函数设为变量(虽然我不太明白它是做什么的),并添加变量以在每个函数中存储书签数组函数的迭代,没有区别。

找到指定文件夹时如何让它返回子书签数组?

【问题讨论】:

  • 什么是遍历书签?
  • 您可以将整个内容包装在另一个函数中,并使用闭包在 findFolder 完成时返回的包装器中设置一个本地变量。
  • 谢谢大家。马修,对不起。多年来,我一直在反复修改代码,实际上将 A 和 B 部分放在不同的函数中。我在这里合并它们以希望使它更简单,但错过了函数名称。 Dandavis,我采用了 Closure 方法,现在运行良好。

标签: javascript google-chrome recursion google-chrome-extension


【解决方案1】:

我使用了递归函数作用域之外的局部变量:

function findFolder(bookmarkNodes, folderName) {

    var bookmarks;

    function crawlFolders(bmn) {
        for(var i=0;i<bmn.length;i++) {
            console.log(bmn[i].title, bmn[i].url ? bmn[i].url : "[Folder]");

            if (bookmarks)
                return;

            if(bmn[i].children) {
                if (bmn[i].title == folderName) {
                    bookmarks = bmn[i].children;
                    return;
                } else {
                    crawlFolders(bmn[i].children);
                }
            }
        }
    }

    crawlFolders(bookmarkNodes);
    return bookmarks;
}

【讨论】:

    猜你喜欢
    • 2022-01-02
    • 1970-01-01
    • 2019-04-25
    • 2013-08-07
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多