Soru `this`'i kaybediyor.
askPassword() çaÄrısı Åifreyi kontrol etmeli ve buna göre user.loginOk veya user.loginFailâi çaÄırmalıdır.
Fakat bu bir hataya neden oluyor. Neden?
Sadece üstü çizili satırda deÄiÅiklik yaparak her Åeyin doÄru çalıÅmasını saÄlayınız. ( diÄer satırlarda deÄiÅiklik yapılmamalıdır)
function askPassword(ok, fail) {
let password = prompt("Password?", '');
if (password == "rockstar") ok();
else fail();
}
let user = {
name: 'John',
loginOk() {
alert(`${this.name} logged in`);
},
loginFail() {
alert(`${this.name} failed to log in`);
},
};
askPassword(user.loginOk, user.loginFail);
Nedeni askâın loginOk/loginFail fonksiyonlarını obje olmadan almasıdır.
Bunları çaÄırdıÄında doÄal olarak this=undefined olarak çalıÅacaktır.
KaynaÄı baÄlar isek:
function askPassword(ok, fail) {
let password = prompt("Password?", '');
if (password == "rockstar") ok();
else fail();
}
let user = {
name: 'John',
loginOk() {
alert(`${this.name} logged in`);
},
loginFail() {
alert(`${this.name} failed to log in`);
},
};
askPassword(user.loginOk.bind(user), user.loginFail.bind(user));
Åimdi çalıÅacaktır.
Alternatif çözüm Åu Åekilde olabilir:
//...
askPassword(() => user.loginOk(), () => user.loginFail());
Genelde bu da çalıÅır. Fakat daha karmaÅık durumlarda userâın soru ve () => user.loginOk() arasında üzerine yazılabilir.