evgeniy8705
@evgeniy8705
Повелитель вселенной

Для чего метод bind с решении задачи?

Учу JS, дошел до темы где разбирается метод bind.
Прочитал лекцию, но практически ничего не понял.
А именно как именно происходит потеря контекста? Как это понять? Как я понял при потере и нужно использовать bind.

Попробывал решить представленные там задачи. Думал думал, но так как не смог разобраться с лекцией, то и задачи естественно не смог решить.
Посмотрел решение, но так и не понял, почему именно нужно использовать bind. Для меня очевидным кажется если просто передать функцию с this, то все будет правильно, но как оказывается, ничего не работает, а если передать с bind (this.function.bind(this, args)), то работет.

Помогите разобраться что к чему, объясните пожалуйста следующее решение задачи:

"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) {
    console.log( this.login + (result ? ' вошёл в сайт' : ' ошибка входа') );
  },

  checkPassword: function() {
    ask("Ваш пароль?", this.password,
        this.loginDone.bind(this, true)
      ,
        this.loginDone.call(this, false)
    );
  }
};

var vasya = user;
user = null;
vasya.checkPassword();
  • Вопрос задан
  • 616 просмотров
Пригласить эксперта
Ответы на вопрос 2
AppFA
@AppFA
Frontend developer at Yandex
Метод bind привязывает контекст к конкретной функции, и т.к. вы передаете эту функцию за пределы данного объекта то при вызове этой функци если не привязать контекст, this будет ссылаться на ту область, где была вызвана эта функция.
+ в метод bind можно сразу передать аргументы и при этом функция не будет выполнена, т.к. bind возвращает замыкание.
Если что, могу помочь в скайпе: lithium100500
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
А именно как именно происходит потеря контекста?


Достаточно вызвать функцию в другом контексте:

var foo = {
    bar: function () {
        console.log(this);
    }
};
var bar = { bar: foo.bar };
foo.bar(); // вызываем функцию в контексте foo.
bar.bar(); // вызываем функцию но уже в контексте bar


В вашем случае вам нужно явно передать контекст во вложенную анонимную функцию.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы