偏函数在登录中的应用
重要程度: 5
这个任务是比 修复丢失了 "this" 的函数 略微复杂的变体。
user
对象被修改了。现在不是两个函数 loginOk/loginFail
,现在只有一个函数 user.login(true/false)
。
在下面的代码中,我们应该向 askPassword
传入什么参数,以使得 user.login(true)
结果是 ok
,user.login(fasle)
结果是 fail
?
function askPassword(ok, fail) {
let password = prompt("Password?", '');
if (password == "rockstar") ok();
else fail();
}
let user = {
name: 'John',
login(result) {
alert( this.name + (result ? ' logged in' : ' failed to log in') );
}
};
askPassword(?, ?); // ?
你只能修改高亮部分的代码。
-
使用包装(wapper)函数,箭头函数很简洁:
askPassword(() => user.login(true), () => user.login(false));
现在它从外部变量中获得了
user
,然后以常规方式运行它。 -
或者从
user.login
创建一个偏函数,该函数使用user
作为上下文,并具有正确的第一个参数:askPassword(user.login.bind(user, true), user.login.bind(user, false));