43 lines
912 B
Markdown
43 lines
912 B
Markdown
|
|
The error occurs because `ask` gets functions `loginOk/loginFail` without the object.
|
|
|
|
When it calls them, they naturally assume `this=undefined`.
|
|
|
|
Let's `bind` the context:
|
|
|
|
```js run
|
|
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));
|
|
*/!*
|
|
```
|
|
|
|
Now it works.
|
|
|
|
An alternative solution could be:
|
|
```js
|
|
//...
|
|
askPassword(() => user.loginOk(), () => user.loginFail());
|
|
```
|
|
|
|
Usually that also works and looks good.
|
|
|
|
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()`.
|