我的功能中的价值来自哪里?

时间:2014-06-15 05:43:01

标签: javascript arrays

我目前正在http://nodeschool.io进行功能性JavaScript练习。

我有以下练习:

  

返回一个获取有效用户列表的函数,如果所有提供的用户都存在于原始用户列表中,则返回一个返回true的函数。

     

您只需要检查ID是否匹配。

示例:

var goodUsers = [
    { id: 1 },
    { id: 2 },
    { id: 3 }
];

// `checkUsersValid` is the function you'll define

var testAllValid = checkUsersValid(goodUsers);

testAllValid([
    { id: 2 },
    { id: 1 }
]);

// => true

testAllValid([
    { id: 2 },
    { id: 4 },
    { id: 1 }
]);

// => false

参数:

  • goodUsers:有效用户列表
  

使用array.somearray.every检查传递给返回函数的每个用户是否都存在于传递给导出函数的数组中。

任务的答案是:

function checkUsersValid(goodUsers) {
    return function (submittedUsers) {
        return submittedUsers.every(function (submittedUser) {
            return goodUsers.some(function (goodUser) {
                return submittedUser.id === goodUser.id;
            });
        });
    };
}

module.exports = checkUsersValid;

但是,我不明白submittedUsers的值来自哪里:

var testAllValid = checkUsersValid(goodUsers);

该函数调用:

testAllValid([
    { id: 2 },
    { id: 1 }
]);

// => true

上述不应等同于:

checkUsersValid([
    {id:2},
    {id:1}
]);

在这种情况下,我在哪里获得submittedUsers的值?

3 个答案:

答案 0 :(得分:1)

我们知道:

function checkUsersValid(goodUsers) {
    return function (submittedUsers) {
        return submittedUsers.every(function (submittedUser) {
            return goodUsers.some(function (goodUser) {
                return submittedUser.id === goodUser.id;
            });
        });
    };
}

我们也知道:

var goodUsers = [
    { id: 1 },
    { id: 2 },
    { id: 3 }
];

var testAllValid = checkUsersValid(goodUsers);

因此通过替换:

var goodUsers = [
    { id: 1 },
    { id: 2 },
    { id: 3 }
];

var testAllValid = function (submittedUsers) {
    return submittedUsers.every(function (submittedUser) {
        return goodUsers.some(function (goodUser) {
            return submittedUser.id === goodUser.id;
        });
    });
};

最后,我们打电话给:

testAllValid([
    { id: 2 },
    { id: 1 }
]);

它的评价是什么?

var goodUsers = [
    { id: 1 },
    { id: 2 },
    { id: 3 }
];

var submittedUsers = [
    { id: 2 },
    { id: 1 }
];

// it evaluates to:

submittedUsers.every(function (submittedUser) {
    return goodUsers.some(function (goodUser) {
        return submittedUser.id === goodUser.id;
    });
});

如果您对其进行评估,则会看到每个submittedUser也是goodUser。因此答案是true

答案 1 :(得分:1)

首先,checkUsersValid只创建一个函数并返回创建的函数。使用任何输入调用它将获得另一个功能。所以,

checkUsersValid([
    {id:2},
    {id:1}
]);

将返回另一个功能。现在,如果您考虑checkUsersValid的作用,它会接受列入白名单的用户列表并返回一个功能,该功能会检查要验证的用户列表是否在白名单用户中。

因此,checkUsersValid创建了一个检查白名单用户的功能,testAllValid是执行实际验证的功能。他们都在做不同的任务。

现在,您可能想知道为什么我们这样做,而不是像

那样
testAllValid(listOfValidUsers, listOfUsersToBeValidated);

如果listOfValidUsers是静态列表,并且您将在多个位置使用testAllValid(即使在listOfValidUsers不在范围内的地方),那么您需要确定为listOfValidUsers提供了testAllValid可用的方法。相反,我们用checkUsersValid创建一个新函数,它可以记住listOfValidUsers(因为闭包属性),你只需要确保函数对象在任何地方都可用。这会使代码变得不那么繁琐。

答案 2 :(得分:0)

这里有两个级别的闭包。在第一级中,您提交了所有有效用户(即goodUsers),并返回function(即testAllValid)。

testAllValid函数也是一个闭包,它接受一个参数(即submittedUsers)并返回最终结果。

请阅读javascript closure了解详情