我正在努力创造一个秘密' 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实现这个功能。但是我对这个练习的意思是练习绑定,这样我才能理解这个概念。
谢谢!
答案 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)));