0

我正在尝试定义一个带有重复函数的 Javascript,但我无法让它工作:

var Repeater = function() {
    this.init.apply(this, arguments);
};

Repeater.prototype = {
    run: 0, // how many runs
    interval: 5, // seconds

    init: function() {
        this.repeat();
    },

    repeat: function() {
        console.log(++this.run);
        setTimeout(this.repeat, this.interval * 1000);
    }
};

var repeater = new Repeater();

这应该怎么做?

4

3 回答 3

2

试试这个代码:

var Repeater = function() {
    this.run = 0;  // how many runs
    this.interval = 5; // seconds
    this.init.apply(this, arguments);
};

Repeater.prototype.init = function() {
    this.repeat();
}

Repeater.prototype.repeat = function() {
    var _this = this;
    console.log(++this.run);
    setTimeout(function () { _this.repeat() }, this.interval * 1000);
};

var repeater = new Repeater();

我已将 run 和 interval 移到构造函数中,因为如果您将其添加到原型中,那么它将分布在所有实例中。

您的问题在于seTimeout-在您的代码中,此计时器设置了新的范围,repeater并且this不再指向Repeater实例,而是指向Timeout实例。您需要缓存this(我称之为缓存_this)并将其调用到传递给的新函数中setTimeout

于 2013-08-15T15:13:53.447 回答
1

试试这样:

var Repeater = function() {
    this.init.apply(this, arguments);
};

Repeater.prototype = {
    run: 0, // how many runs
    interval: 5, // seconds

    init: function() {
        this.repeat();
    },

    repeat: function() {
        console.log(++this.run);
        var that = this;
        setTimeout(function() {that.repeat()}, this.interval * 1000);
    }
};

var repeater = new Repeater();

this您可以在此问题中阅读有关行为方式的更多信息: “this”关键字如何工作?

于 2013-08-15T15:09:41.077 回答
0

更改您的重复函数以在 setTimeout 调用中使用闭包,如下所示:

repeat: function() {
var ctx = this;
    console.log(++this.run);
    setTimeout(function(){ctx.repeat()}, this.interval * 1000);
}

您需要在这些场景中显式设置上下文 - 这就是 ctx 变量的用途

于 2013-08-15T15:17:05.120 回答