返回课程

登录部分应用

重要性:5

此任务是 修复丢失“this”的函数 的更复杂变体。

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

在下面的代码中,我们应该将什么传递给 askPassword,以便它将 user.login(true) 作为 okuser.login(false) 作为 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));