renovations
This commit is contained in:
parent
c7d4c7e3ff
commit
e1948130f6
170 changed files with 1496 additions and 1161 deletions
69
1-js/6-objects-more/7-bind/6-ask-currying/solution.md
Normal file
69
1-js/6-objects-more/7-bind/6-ask-currying/solution.md
Normal file
|
@ -0,0 +1,69 @@
|
|||
# Решение с bind
|
||||
|
||||
Первое решение -- передать в `ask` функции с привязанным контекстом и аргументами.
|
||||
|
||||
```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',
|
||||
|
||||
loginDone: function(result) {
|
||||
alert(this.login + (result ? ' вошёл в сайт' : ' ошибка входа'));
|
||||
},
|
||||
|
||||
checkPassword: function() {
|
||||
*!*
|
||||
ask("Ваш пароль?", this.password, this.loginDone.bind(this, true), this.loginDone.bind(this, false));
|
||||
*/!*
|
||||
}
|
||||
};
|
||||
|
||||
user.checkPassword();
|
||||
```
|
||||
|
||||
# Решение с локальной переменной
|
||||
|
||||
Второе решение -- это скопировать `this` в локальную переменную (чтобы внешняя перезапись не повлияла):
|
||||
|
||||
```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',
|
||||
|
||||
loginDone: function(result) {
|
||||
alert(this.login + (result ? ' вошёл в сайт' : ' ошибка входа'));
|
||||
},
|
||||
|
||||
checkPassword: function() {
|
||||
var self = this;
|
||||
*!*
|
||||
ask("Ваш пароль?", this.password,
|
||||
function() { self.loginDone(true); },
|
||||
function() { self.loginDone(false); }
|
||||
);
|
||||
*/!*
|
||||
}
|
||||
};
|
||||
|
||||
user.checkPassword();
|
||||
```
|
||||
|
||||
Оба решения хороши, вариант с `bind` короче.
|
53
1-js/6-objects-more/7-bind/6-ask-currying/task.md
Normal file
53
1-js/6-objects-more/7-bind/6-ask-currying/task.md
Normal file
|
@ -0,0 +1,53 @@
|
|||
# Использование функции вопросов с каррингом
|
||||
|
||||
[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`, другое -- без него. Какое решение лучше?
|
Loading…
Add table
Add a link
Reference in a new issue