У меня есть 2 блока кода, один из которых не работает, и тот, который работает, потому что я назначаю это = this и использую его в своей функции вместо этого. Может кто-нибудь помочь мне понять, почему это так. Это помогло бы узнать, как нужно думать о доступе к переменным в функциях в объектах в JavaScript и о характере «этого», если я говорю это правильно (если нет, пожалуйста, просветите меня). Спасибо!Понимание «этого» в Javascript
var add = function (x, y) {
return x + y;
}
var myObject = {
value: 0,
increment: function (inc) {
this.value += typeof inc === 'number' ? inc : 1;
}
};
myObject.double2 = function() {
// var that = this;
var helper = function() {
this.value = add(this.value, this.value)
};
helper();
};
myObject.increment(100);
document.writeln(myObject.value); // Prints 100
myObject.double2();
document.writeln('<BR/>'); // Prints <BR/>
document.writeln(myObject.value); // Prints 100, **FAILS**
И модифицированный код:
var add = function (x, y) {
return x + y;
}
var myObject = {
value: 0,
increment: function (inc) {
this.value += typeof inc === 'number' ? inc : 1;
}
};
myObject.double2 = function() {
var that = this;
var helper = function() {
that.value = add(that.value, that.value)
};
helper();
};
myObject.increment(100);
document.writeln(myObject.value); // Prints 100
myObject.double2();
document.writeln('<BR/>'); // Prints <BR/>
document.writeln(myObject.value); // Prints 200 - **NOW IT WORKS**
'this' относится к локальному контексту выполнения. (Я на 100% уверен, что кто-то еще может сказать это лучше меня.) Ваша переменная 'that' - это закрытие, которое фиксирует значение' this', так что вы можете ссылаться на него внутри вызова функции, когда это происходит, в какой-то момент в будущем. – asawyer