为什么JavaScript函数返回undefined

时间:2013-02-06 08:47:38

标签: javascript

当console.log打印出正确的结果时,我不知道为什么这个小东西会返回“undefined”。 Thx提前。

App.Presentation.prototype.getLeaf = function(leafSlug, tree) {
    for (var key in tree.content) {
        if (tree.content[key].type === 'leaf' && tree.content[key].slug === leafSlug) {
            console.log(tree.content[key]) // this works Correct
            return tree.content[key]; // this returns undefined :<
        } else {
            this.getLeaf(leafSlug, tree.content[key]);    
        }
    }

};

我在控制台中这样称呼它:

Presentation.getLeaf("chpl", Presentation.tree);

得到这个结果:

(来自console.log的第一个结果)

Object {type: "leaf", alias: "Chpl bla bla bla", slug: "chpl", group: "", order: ""…}
alias: "Chpl bla bla bla"
group: ""
html: "<img src='bg.png' />"
order: ""
parent: "chpl"
slug: "chpl"
type: "leaf"
__proto__: Object

(来自return的下一个结果)

undefined

Presentation.tree是一个包含解析为对象的JSON的变量。

3 个答案:

答案 0 :(得分:1)

如果tree.content没有您的条件为真的密钥,那么您的函数永远不会return,所以您可以返回undefined

即使某些递归调用可能log某些东西,它们的结果也不会在任何地方使用。您还需要从调用函数返回递归调用的结果!将else-branch更改为

var res = this.getLeaf(leafSlug, tree.content[key]);
if (res)
    return res;

答案 1 :(得分:0)

你没有从递归调用中返回任何内容。这里可能还有其他注意事项,但在某些时候你会想要返回递归调用的结果,例如:

App.Presentation.prototype.getLeaf = function(leafSlug, tree) {
    for (var key in tree.content) {
        if (tree.content[key].type === 'leaf' && tree.content[key].slug === leafSlug) {
            console.log(tree.content[key]) // this works Correct
            return tree.content[key]; // this returns undefined :<
        } else {
            return this.getLeaf(leafSlug, tree.content[key]);    
        }
    }
}

答案 2 :(得分:0)

解决。正确的重复搜索嵌套对象的树应该如下所示:

Presentation.prototype.getLeaf = function(leafSlug, tree) {
    var tempReturn;
    for (var key in tree.content) {
        if (tree.content[key].type === 'leaf' && tree.content[key].slug === leafSlug) {
            return tree.content[key];
        }  else {
            if (tree.content[key] instanceof Object && tree.content[key].hasOwnProperty('content')) {
                tempReturn = this.getLeaf(leafSlug, tree.content[key]);
                if (tempReturn) { return tempReturn }
            }
        }
    }
    return false;
};

不必在找不到任何内容时调用this.getLeaf(leafSlug, tree.content[key]);,而是必须将此调用的结果分配给变量tempReturn = this.getLeaf(leafSlug, tree.content[key]);,检查是否返回了某些内容if (tempReturn),如果是,则返回该结果{{1 }}

我还添加了对分支结束的测试,以便不在{ return tempReturn }元素上调用递归:

undefined