0

に関連する問題の修正を手伝ってもらえますかsetInterval? 私は JavaScript にかなり慣れていないので、ここで何が問題なのかわかりません。私のページには次のブロックがあります。

GlobalTicker.prototype.TickElements = function () {
    this.timer = setInterval(this.initializeElement.apply(this) , 1000);
};
GlobalTicker.prototype.initializeElement = function () {
    for (var i = 0; i < this.tickerElements.length; i++) {
        var existingRun = this.tickerElements[i].secs;
        var elementId = $('#' + this.tickerElements[i].id + ' .comment-editor').find('.ticker');
        existingRun -= 1;
        $(elementId).text(existingRun);
        if (existingRun === 0) {
            $(elementId).remove();
            this.tickerElements.splice(i, 1);
            if (this.tickerElements.length == 0) clearInterval(this.tickerElements.timer);
        }
    }
};

次に、コードのどこかに、関数でこの呼び出しがあります

var objTicker = new GlobalTicker();
CommentManagement.prototype.createComment = function (domObject) {
    objTicker.TickElements();
};

この関数呼び出しは実際に関数を呼び出しsetInterval、最初の反復を実行してにジャンプしますinitialiseComment();が、このブロックが実行されると、次の間隔で、initialiseComment();再度実行する代わりに、関数呼び出しに戻りますCreateComment();。ここで何が間違っていますか?

4

1 に答える 1

3

setInterval()関数参照が必要です。関数自体を呼び出し、関数の実行からの戻り結果 (これは でしたundefined) を に渡していましたsetInterval()。その戻り値は関数ではないためsetInterval()、呼び出すコールバック関数はありませんでした。したがって、メソッドは最初に呼び出したときに 1 回実行されましたが、その間隔で呼び出すことができませんでした。

これを修正するには、次のように変更する必要があります。

this.timer = setInterval(this.initializeElement.apply(this) , 1000);

これに:

var self = this;
this.timer = setInterval(function() {self.initializeElement()}, 1000);

の値はコールバックでも必要な値とthisは異なるsetInterval()ため、必要な値がここに保存され、selfそこから参照できることに注意してください。.apply()オブジェクトでメソッドを呼び出すと、必要に応じてthisポインターが自動的に設定されるため、この場合も使用する必要はありません。

于 2013-03-29T21:31:04.333 に答える