Soru `this`'i kaybediyor.
önem: 5
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.