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