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

2 KiB
Raw Blame History

Использование функции вопросов с каррингом

[importance 5]

Эта задача -- усложнённый вариант задачи . В ней объект user изменён.

Теперь вместо двух функций user.loginOk() и user.loginFail() теперь один метод: user.loginDone(true/false), который нужно вызвать с true при верном ответе и fail -- при неверном.

Код ниже делает это, соответствующий фрагмент выделен.

Сейчас он обладает важным недостатком: при записи в user другого значения объект перестанет корректно работать, вы увидите это, запустив пример ниже (будет ошибка).

Как бы вы написали правильно?

Исправьте выделенный фрагмент, чтобы код заработал.

//+ 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, другое -- без него. Какое решение лучше?