将函数赋给数组元素。如何绑定函数的输出?

时间:2018-03-16 22:32:22

标签: javascript data-binding closures

我正在努力创造一个秘密' guestList在JS中练习一些闭包和绑定。我目前卡住了,因为我需要使用绑定,所以i的值在每次迭代后都会更新,但我真的很新,但我无法解决这个问题...我如何调用我的变量{来自封闭的{1}}?如何正确绑定guesName到我的checkCode函数? :/

这是我的代码:

code

我的测试值:

function guestListFns(guestList, secretCode){
    var topSecretList = []; 
    function codeChecker(code) {
        if (code === secretCode) {
            return guestName;
        } else {
            return "Secret-Code: Invalid";
        }
    };
    for(var i = 0 ; i < guestList.length; i += 1){
        var guestName = guestList[i]; 
            topSecretList.push(codeChecker.call(this.guestName, code));
    }
    console.log(topSecretList);

        return topSecretList; 
}
到目前为止

我的回报值:

    var guestListFns = guestListFns(["Gabriel", "Ben", "Dan", "Griffin", "Cang", "Kate", "Chris"], 512);

var guest = guestListFns[1](512);
console.log(guest);

另外,我已经想出了如何使用map实现这个功能。但是我对这个练习的意思是练习绑定,这样我才能理解这个概念。

谢谢!

3 个答案:

答案 0 :(得分:1)

你不想call,但你想要bind

codeChecker.bind({ guestName })

所以现在在codeChecker里面你可以访问

this.guestName

实际上你太复杂了:

 const guestListFns = (arr, secret) =>
   arr.map(el => code => code === secret ? el : "nope");

答案 1 :(得分:1)

如果我理解你在尝试什么,我认为call()是错误的做法。您需要一个部分函数数组,其中每个函数都已具有名称。您可以使用bind()call()实际上调用了函数,这不是你真正想要的。 bind()返回一个新函数,允许您设置this和/或一些参数:

function guestListFns(guestList, secretCode){
    var topSecretList = []; 
    function codeChecker(guestName, code) {
        if (code === secretCode) {
            return guestName;
        } else {
            return "Secret-Code: Invalid";
        }
    };
    for(var i = 0 ; i < guestList.length; i += 1){
        var guestName = guestList[i]; 
        topSecretList.push(codeChecker.bind(null, guestName));
    }

    return topSecretList; 
}

var guestListFns = guestListFns(["Gabriel", "Ben", "Dan", "Griffin", "Cang", "Kate", "Chris"], 512);

console.log(guestListFns[1](512)); // ben
console.log(guestListFns[2](512)); // dan
console.log(guestListFns[1](112)); // bad code

答案 2 :(得分:0)

这可能是你想要的吗?

function guestListFns(guestList, secretCode){
    var topSecretList = []; 
    function codeChecker(code) {
        if (code === secretCode) {
            return this.guestName;
        } else {
            return "Secret-Code: Invalid";
        }
    };
    for(var i = 0 ; i < guestList.length; i += 1){
        var guestName = guestList[i]; 
        topSecretList.push(codeChecker.bind({guestName:guestName}));
    }
    console.log(topSecretList);

        return topSecretList; 
}

var gfn = guestListFns(["Gabriel", "Ben", "Dan", "Griffin", "Cang", "Kate", "Chris"], 512);
gfn.forEach(f => console.log(f(512)));