Opravte funkci, která ztrácà âthisâ
Volánà zeptejSeNaHeslo() v následujÃcÃm kódu by mÄlo zkontrolovat heslo a pak podle toho, jaká je odpovÄÄ, zavolat uživatel.pÅihlášenÃOK/pÅihlášenÃSelhalo.
Vede vÅ¡ak k chybÄ. ProÄ?
Opravte zvýraznÄný Åádek tak, aby vÅ¡echno zaÄalo fungovat správnÄ (ostatnà Åádky nemÄÅte).
function zeptejSeNaHeslo(ok, selhal) {
let heslo = prompt("Heslo?", '');
if (heslo == "rockstar") ok();
else selhal();
}
let uživatel = {
jméno: 'Jan',
pÅihlášenÃOK() {
alert(`${this.jméno} pÅihlášen`);
},
pÅihlášenÃSelhalo() {
alert(`${this.jméno} se nedokázal pÅihlásit`);
},
};
zeptejSeNaHeslo(uživatel.pÅihlášenÃOK, uživatel.pÅihlášenÃSelhalo);
Chyba nastane proto, že funkce zeptejSeNaHeslo obdržà funkce pÅihlášenÃOK/pÅihlášenÃSelhalo bez objektu.
Když je zavolá, pÅirozenÄ pÅedpokládajà this=undefined.
Navažme kontext funkcà bind:
function zeptejSeNaHeslo(ok, selhal) {
let heslo = prompt("Heslo?", '');
if (heslo == "rockstar") ok();
else selhal();
}
let uživatel = {
jméno: 'Jan',
pÅihlášenÃOK() {
alert(`${this.jméno} se pÅihlásil`);
},
pÅihlášenÃSelhalo() {
alert(`${this.jméno} se nedokázal pÅihlásit`);
},
};
zeptejSeNaHeslo(uživatel.pÅihlášenÃOK.bind(uživatel), uživatel.pÅihlášenÃSelhalo.bind(uživatel));
TeÄ to funguje.
Alternativnà ÅeÅ¡enà by mohlo být:
//...
zeptejSeNaHeslo(() => uživatel.pÅihlášenÃOK(), () => uživatel.pÅihlášenÃSelhalo());
Obvykle to také funguje a vypadá dobÅe.
Je to vÅ¡ak ménÄ spolehlivé ve složitÄjÅ¡Ãch situacÃch, kdy se promÄnná uživatel může zmÄnit po volánà zeptejSeNaHeslo, ale pÅed odpovÄdà návÅ¡tÄvnÃka a volánÃm () => uživatel.pÅihlášenÃOK().