en.javascript.info/1-js/6-objects-more/7-bind/6-ask-currying/task.md
2015-01-14 10:23:45 +03:00

53 lines
2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Использование функции вопросов с каррингом
[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`, другое -- без него. Какое решение лучше?