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.
-
Brug enten en wrapper funktion, en arrow for at gøre det helt kort:
askPassword(() => user.login(true), () => user.login(false));Nu henter
userfra ydre variable og kører normalt. -
eller opret en delvis funktion fra
user.loginder brugerusersom kontekst og det korrekte første argument:askPassword(user.login.bind(user, true), user.login.bind(user, false));