ÐÑпÑавÑÑе ÑÑнкÑиÑ, ÑеÑÑÑÑÑÑ "this"
ÐÑзов askPassword() в пÑиведÑнном ниже коде должен пÑовеÑиÑÑ Ð¿Ð°ÑÐ¾Ð»Ñ Ð¸ заÑем вÑзваÑÑ user.loginOk/loginFail в завиÑимоÑÑи Ð¾Ñ Ð¾ÑвеÑа.
Ðднако, его вÑзов пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº оÑибке. ÐоÑемÑ?
ÐÑпÑавÑÑе вÑделеннÑÑ ÑÑÑокÑ, ÑÑÐ¾Ð±Ñ Ð²ÑÑ ÑабоÑало (дÑÑÐ³Ð¸Ñ ÑÑÑок изменÑÑÑ Ð½Ðµ надо).
function askPassword(ok, fail) {
let password = prompt("Password?", '');
if (password == "rockstar") ok();
else fail();
}
let user = {
name: 'ÐаÑÑ',
loginOk() {
alert(`${this.name} logged in`);
},
loginFail() {
alert(`${this.name} failed to log in`);
},
};
askPassword(user.loginOk, user.loginFail);
ÐÑибка пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¿Ð¾ÑомÑ, ÑÑо askPassword полÑÑÐ°ÐµÑ ÑÑнкÑии loginOk/loginFail без конÑекÑÑа.
Ðогда они вÑзÑваÑÑÑÑ, Ñо, еÑÑеÑÑвенно, this=undefined.
ÐÑполÑзÑем bind, ÑÑÐ¾Ð±Ñ Ð¿ÐµÑедаÑÑ Ð² askPassword ÑÑнкÑии loginOk/loginFail Ñ Ñже пÑивÑзаннÑм конÑекÑÑом:
function askPassword(ok, fail) {
let password = prompt("Password?", '');
if (password == "rockstar") ok();
else fail();
}
let user = {
name: 'ÐаÑÑ',
loginOk() {
alert(`${this.name} logged in`);
},
loginFail() {
alert(`${this.name} failed to log in`);
},
};
askPassword(user.loginOk.bind(user), user.loginFail.bind(user));
ТепеÑÑ Ð²ÑÑ ÑабоÑÐ°ÐµÑ ÐºÐ¾ÑÑекÑно.
ÐлÑÑеÑнаÑивное ÑеÑение â ÑделаÑÑ ÑÑнкÑии-обÑÑÑки над user.loginOk/loginFail:
//...
askPassword(() => user.loginOk(), () => user.loginFail());
ÐбÑÑно ÑÑо Ñакже ÑабоÑÐ°ÐµÑ Ð¸ Ñ
оÑоÑо вÑглÑдиÑ. Ðо Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ ÑÑабоÑаÑÑ Ð² более ÑложнÑÑ
ÑиÑÑаÑиÑÑ
, а именно â когда знаÑение пеÑеменной user менÑеÑÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð²Ñзовом askPassword и вÑполнением () => user.loginOk().