en.javascript.info/1-js/6-objects-more/7-bind/6-ask-currying/solution.md
2015-03-10 12:36:58 +03:00

1.7 KiB
Raw Blame History

Решение с bind

Первое решение -- передать в ask функции с привязанным контекстом и аргументами.

//+ 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 в локальную переменную (чтобы внешняя перезапись не повлияла):

//+ 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 короче.