Как понимать «{ fun: function.bind(это) }»?

#javascript

#javascript

Вопрос:

 var a = 2;
var c = {
    a: 3,
    say: function() {
        console.log(this.a);
    }.bind(this);
};
c.say();
// Ouput: 2
  

Результат равен 2, и я не знаю почему. Почему это указывает на глобальный?

Комментарии:

1. Значением по умолчанию this является window

2. Используете ли вы Node.js ?

3. Я думаю, вы можете спутать глобальную переменную a со свойством модуля a. Попробуйте var Geta = retrievea.bind(c); Geta() после и удалите привязку(this);

Ответ №1:

Когда этот оператор выполняется в глобальной области видимости:

 var a = 2;
  

это равно window.a = 2 .

В вашем коде первое, что происходит, это выполнение .bind(this) метода. Поскольку вы находитесь в глобальной области видимости, this здесь указано на window . Итак, say функция привязана к window и this.a внутри этой функции как бы становится window.a и, соответственно, это console.log(this.a) становится console.log(window.a) .

Чтобы понять поведение, вы должны сначала понять, что bind делает. Проверьте эту документацию. Проверьте это, например:

 var a = 2;
var c = {
    a: 3,
    say: function() {
        console.log(this.a);
    }.bind({a: 7});
};
c.say(); // outputs 7
  

Комментарии:

1. Выполняется ли .bind(this) метод, когда c был определен? Или это выполняется, когда я выполняю c.say() ?

2. @Maxmengt, это было выполнено до того, как c был определен и инициализирован, потому что значение для say требуется для инициализации c .

3. @Maxmengt, есть ли что-нибудь еще неясное? Если вы нашли мой ответ полезным, пожалуйста, примите его.

4. Спасибо за ваш ответ. Просто дай мне немного времени.

Ответ №2:

Поскольку вы находитесь в анонимной функции, вы не вызываете из c . Используйте c.a вместо этого.

Комментарии:

1. Спасибо за редактирование. Я швейцарец (носитель швейцарско-немецкого языка) и стараюсь писать на как можно более хорошем английском. Иногда у меня не получается, но я всегда благодарен таким людям, как вы! 🙂

2. Спасибо за ваш ответ 🙂

Ответ №3:

Значение по умолчанию для this равно window . Также, поскольку ваш код не заключен в функцию, var a становится частью window

Попробуйте обернуть это внутри IIFE

 (function() {
  var a = 2;
  var c = {
    a: 3,
    say: function() {
      console.log(this.a);
    }.bind(this)
  };
  c.say();
})()  

Комментарии:

1. Спасибо за ваш ответ 🙂