53 lines
2 KiB
Markdown
53 lines
2 KiB
Markdown
# Использование функции вопросов с каррингом
|
||
|
||
[importance 5]
|
||
|
||
Эта задача -- усложнённый вариант задачи [](/task/question-use-bind). В ней объект `user` изменён.
|
||
|
||
Теперь вместо двух функций `user.loginOk()` и `user.loginFail()` теперь один метод: `user.loginDone(true/false)`, который нужно вызвать с `true` при верном ответе и `fail` -- при неверном.
|
||
|
||
Код ниже делает это, соответствующий фрагмент выделен.
|
||
|
||
**Сейчас он обладает важным недостатком: при записи в `user` другого значения объект перестанет корректно работать, вы увидите это, запустив пример ниже (будет ошибка).**
|
||
|
||
Как бы вы написали правильно?
|
||
|
||
**Исправьте выделенный фрагмент, чтобы код заработал.**
|
||
|
||
```js
|
||
//+ run
|
||
"use strict";
|
||
|
||
function ask(question, answer, ok, fail) {
|
||
var result = prompt(question, '');
|
||
if (result.toLowerCase() == answer.toLowerCase()) ok();
|
||
else fail();
|
||
}
|
||
|
||
var user = {
|
||
login: 'Василий',
|
||
password: '12345',
|
||
|
||
// метод для вызова из ask
|
||
loginDone: function(result) {
|
||
alert(this.login + (result ? ' вошёл в сайт' : ' ошибка входа'));
|
||
},
|
||
|
||
checkPassword: function() {
|
||
*!*
|
||
ask("Ваш пароль?", this.password,
|
||
function() { user.loginDone(true); },
|
||
function() { user.loginDone(false); }
|
||
);
|
||
*/!*
|
||
}
|
||
};
|
||
|
||
var vasya = user;
|
||
user = null;
|
||
vasya.checkPassword();
|
||
```
|
||
|
||
Изменения должны касаться только выделенного фрагмента.
|
||
|
||
Если возможно, предложите два решения, одно -- с использованием `bind`, другое -- без него. Какое решение лучше?
|