darsga qaytish

this yo'qotishni so'rang

muhimlik: 5

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().