繁体   English   中英

函数中的值从何而来?

[英]Where does the value in my function come from?

目前,我正在通过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

我们知道:

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

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

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

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

因此, checkUsersValid创建一个函数来检查列入白名单的用户,而testAllValid是执行实际验证的函数。 他们俩都在做不同的任务。

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

testAllValid(listOfValidUsers, listOfUsersToBeValidated);

如果listOfValidUsers是静态列表,并且您打算在多个地方(甚至在listOfValidUsers不在范围内的地方)使用testAllValid ,那么您需要找出一种使listOfValidUsers可用于testAllValid 相反,我们使用checkUsersValid创建了一个新函数,该函数可以记住listOfValidUsers (由于使用了Closure属性),您只需要确保该函数对象随处可见即可。 这样可以减少代码的麻烦。

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

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

请阅读javascript闭包以获取详细信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM