#javascript
#javascript
Вопрос:
var a = 2;
var c = {
a: 3,
say: function() {
console.log(this.a);
}.bind(this);
};
c.say();
// Ouput: 2
Результат равен 2, и я не знаю почему. Почему это указывает на глобальный?
Комментарии:
1. Значением по умолчанию
this
является window2. Используете ли вы 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. Спасибо за ваш ответ 🙂