为什么对象方法不返回值?

时间:2019-05-17 03:55:25

标签: javascript object methods return-value

在以下代码中,函数findById()实际上未返回任何内容。 console.log()会按预期触发并打印,但结果是调用该函数的变量未定义。

我试图更改返回值类型,甚至简单地将return true;放在无条件的末尾,但是它始终是不确定的。为了确保我没有错过简单的事情,我实际上创建了一个仅返回值istrue()的函数。这实际上可以正常工作。

这是对象/方法定义

const database = {
    // List of authenticated characters
    characters: [],
    addCharacter: function(c) {
        this.characters.push(c);
    },
    findById: function(id) {
        console.log('Searching for character...');
        this.characters.forEach((c) => {
            if (c.id === id) {
                console.log('Found');
                console.log('cid: ' + c.id);
                console.log('id: ' + id);
                return true; // Never actually returns
            }
        });
    },
    istrue: function() {
        return true;
    }
};

以及它的调用位置

const find = database.findById(characterIdToFind);
console.log(typeof find); // always undefined
console.log(find); // always undefined

我希望在我尝试过的此函数的至少一个排列中会有某种返回值。函数的返回值永远不会有任何变化,只需undefined

2 个答案:

答案 0 :(得分:4)

嵌套函数中的return语句从函数返回。

在这种情况下,您可以使用some()代替forEach(),因为您不能破坏forEach

findById: function(id) {
    console.log('Searching for character...');
    return this.characters.some(c => c.id === id)
}

如果要获取与使用find()的给定条件匹配的对象

findById: function(id) {
    console.log('Searching for character...');
    return this.characters.find(c => c.id === id)
}

如果您在以上两种方法中都看到过,我们在每次迭代中都会隐式返回c.id === id,但不是从外部函数中返回return

答案 1 :(得分:2)

这是因为您尝试从forEach返回,而forEach不返回任何内容