this yo'qotishni so'rang
Quyidagi koddagi askPassword()
ga chaqiruv parolni tekshirishi kerak va keyin javobga qarab user.loginOk/loginFail
chaqirishi kerak.
Ammo bu xatoga olib keladi. Nima uchun?
Hammasi to’g’ri ishlashni boshlashi uchun ajratilgan satrni to’g’rilab qo’ying (boshqa satrlarni o’zgartirish kerak emas).
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);
Xato yuz berdi, chunki ask
obyektsiz loginOk/loginFail
funktsiyalarini oladi.
Ularni chaqirganda, ular tabiiy ravishda this=undefined
deb taxmin qilishadi.
Keling, kontekstni bog’laymiz:
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));
Endi u ishlaydi.
Muqobil yechim bo’lishi mumkin:
//...
askPassword(
() => user.loginOk(),
() => user.loginFail()
);
Odatda bu ham ishlaydi, lekin user
so’rash va ishga tushirish vaqtlari orasida yozilishi mumkin bo’lgan murakkab vaziyatlarda ishlamay qolishi mumkin () => user.loginOk ()
.
It’s a bit less reliable though in more complex situations where user
variable might change after askPassword
is called, but before the visitor answers and calls () => user.loginOk()
.