tilbage til lektionen

Partial application for login

vigtighed: 5

Denne opgave er en lidt mere kompleks variant af Fix en funktion der mister "this".

user objektet er ændret. Nu har den, i stedet for to funktioner loginOk/loginFail, én enkelt funktion user.login(true/false).

Hvad skal vi sende til askPassword i koden nedenfor, så den kalder user.login(true) som ok og user.login(false) som 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(?, ?); // ?

Din ændring skal kun ændre den fremhævede linje.

  1. Brug enten en wrapper funktion, en arrow for at gøre det helt kort:

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

    Nu henter user fra ydre variable og kører normalt.

  2. eller opret en delvis funktion fra user.login der bruger user som kontekst og det korrekte første argument:

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