回到课程

偏函数在登录中的应用

重要程度: 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. 使用封装函数,箭头函数很简洁

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

    现在它从外部变量中获得 user,正常运行。

  2. user.login 中创建偏函数,使用 user 作为上下文,并确定第一个参数:

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