回到课程

偏函数在登录中的应用

重要程度: 5

这个任务是比 修复丢失了 "this" 的函数 略微复杂的变体。

user 对象被修改了。现在不是两个函数 loginOk/loginFail,现在只有一个函数 user.login(true/false)

在下面的代码中,我们应该向 askPassword 传入什么参数,以使得 user.login(true) 结果是 okuser.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(?, ?); // ?

你只能修改高亮部分的代码。

  1. 使用包装(wapper)函数,箭头函数很简洁:

    askPassword(() => user.login(true), () => user.login(false));

    现在它从外部变量中获得了 user,然后以常规方式运行它。

  2. 或者从 user.login 创建一个偏函数,该函数使用 user 作为上下文,并具有正确的第一个参数:

    askPassword(user.login.bind(user, true), user.login.bind(user, false));