Javascript: поле объекта не определено, если оно передано как "this" в качестве параметра функции

89
10

У меня есть что-то вроде page controller Page, и я бы хотел использовать модель Tim и выполнить обратный вызов другого метода с контроллера Page.

Не могли бы вы объяснить, что здесь происходит?

Код выглядит следующим образом:

//the model:
var Tim = function(){};
Tim.prototype.setDuration = function (duration) {
this._duration = duration;
};
Tim.prototype.count = function(doSomething) {
doSomething(this)
}

//the Page controller:
var Page = function(tim){
this.tim = tim; // initialisation of this.tim
};
Page.prototype.init = function () {
this.tim.count(this.pollStatus);
};
Page.prototype.pollStatus = function(tim) {
this.tim = tim; // I still have to assign this.tim for the second time
$.ajax({
url: 'http://end/point',
type: "GET",
success: function (data) {
this.tim.setDuration(data.duration);
}.bind(this)
});
}
$(document).ready(function () {
var tim = new Tim();
var page = new Page(tim);
page.init();
})

Я должен назначить this.tim два раза, потому что он не undefined если нет.

спросил(а) 2021-01-25T22:06:23+03:00 4 месяца, 2 недели назад
1
Решение
125

Когда вы вызываете doSomething(this) в

Tim.prototype.count = function(doSomething) {
doSomething(this)
}

контекст для doSomething является глобальным, и this в нем есть window.

Вы знаете, что такое bind, используйте его:

Page.prototype.init = function () {
this.tim.count(this.pollStatus.bind(this));
};

Page.prototype.pollStatus = function(tim) {
//this.tim = tim; now the code works without this assignment
...

ответил(а) 2021-01-25T22:06:23+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема