Почему свойство не определено в экземпляре таймера, когда в интервале цикла? - PullRequest
1 голос
/ 22 декабря 2011
function UITimer(interval, callbakFunction) {
    this.t = null;
    this.isRunning = 0;
    this.interval = interval;
    this.callbackFunction = callbakFunction;
};

UITimer.prototype.timeCount = function () {
    alert(this.interval);
    this.callbackFunction();
    this.t = setTimeout(this.timeCount, this.interval);
}

UITimer.prototype.startTimer = function () {
    if (!this.isRunning) {
        this.isRunning = 1;
        this.timeCount();
    }
}

UITimer.prototype.stopTimer = function () {
    clearTimeout(this.t);
    this.isRunning = 0;
}

var uiTimer = new UITimer(5000, PhotoService.GetRandomImage);
uiTimer.startTimer();

Первый раз this.interval = 5000, второй раз undefined. Я заменил интервал на постоянное значение, но эта строка this.t = setTimeout(this.timeCount, 5000); не может работать во второй раз. В чем проблема?

1 Ответ

3 голосов
/ 22 декабря 2011

Значение this теряется при передаче функции. foo.bar() устанавливает this в foo внутри bar, но при сохранении / передаче значения и последующем вызове этого не происходит.

Используйте .bind для принудительного ввода значения this внутри timeCount:

this.t = setTimeout(this.timeCount.bind(this), this.interval);

Или передайте другую функцию, которая вызывает timeCount. Однако будьте осторожны, поскольку this изменяется внутри функций, вам нужно сохранить ссылку на правильное значение this:

var _this = this; // won't change

this.t = setTimeout(function() {
    _this.timeCount(); // `_this` is the correct `this`
}, this.interval);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...