kembali ke pelajaran

Perbaiki sebuah fungsi yang telah kehilangan "this"

Pemanggilan kepada askPassword() didalam kode dibawah harus memeriksa passwordnya dan lalu memanggil user.loginOk/loginFail tergantung dari jawabannya.

Tapi pemanggilan itu mengembalikan sebuah error. kenapa?

Perbaiki baris yang di tandai agar kodenya dapat berjalan dengan benar (baris lainnya tidak perlu diubah).

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);

Errornya muncul karena ask mendapatkan fungsi loginOk/loginFail tanpa objeknya.

ketika ask memanggil, loginOk/loginFail mengasumsikan bahwa this=undefined.

Ayo kita coba bind konteksnya:

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));

Sekarang kodenya berjalan.

Alternatif lainnya bisa menggunakan:

//...
askPassword(() => user.loginOk(), () => user.loginFail());

Contoh diatas biasanya bekerja dan terlihat lebih rapih.

Cara ini sedikit kurang bisa digunakan didalam situasi yang lebih kompleks dimana variabel user mungkin berubah setelah askPassword dipanggil, tapi sebelum pengguna menjawab dan memanggil () => user.loginOk().