JavaScript递归设置超时

JavaScript递归设置超时,javascript,settimeout,javascript-objects,Javascript,Settimeout,Javascript Objects,我用JavaScript定义了这个类: function Signal(lbl, ho, tag) { this.lbl = lbl; this.ho = ho; this.tag = tag; this.getstatus = function () { if (this.ho) { $.get('/get.cgi?' + this.tag + '=?0', function (data) {

我用JavaScript定义了这个类:

function Signal(lbl, ho, tag) {
    this.lbl = lbl;
    this.ho = ho;
    this.tag = tag;
    this.getstatus = function () {
        if (this.ho) {
            $.get('/get.cgi?' + this.tag + '=?0', function (data) {
                console.log(data);
                setTimeout(this.getstatus, 1000);
            });
        }
    };
}
一旦调用了getstatus,它应该开始使用setTimout调用自己,但是它没有!它只工作一次

如果我使用一个没有类的函数,它就可以工作

请帮帮我


谢谢

问题是当计时器调用
getStatus
时,
this
在方法中不引用对象,您可以使用
bind()
this
传递自定义值。还要注意,在ajax回调
中,此
引用ajax设置对象

function Signal(lbl, ho, tag) {
    this.lbl = lbl;
    this.ho = ho;
    this.tag = tag;
    this.getstatus = function () {
        if (this.ho) {
            var signal = this;
            $.get('/get.cgi?' + this.tag + '=?0', function (data) {
                console.log(data);
                setTimeout(signal.getstatus.bind(signal), 1000);
            });
        }
    };
}

this
的错误用法请尝试在打开if之后放置类似于
var self=this
的内容,然后调用
self.getstatus
,这是一个迂腐的注释,Javascript没有类。。。拥抱原型的自由!我喜欢使用比“self”(或“that”)更具表现力的名称,在这种情况下,signal似乎更合适,因此
var signal=this
signal.getstatus.bind(signal)
很清楚这是什么界限。还可以使用
setTimeout(function(){signal.getstatus()},1000)
@RobG:
signal
设置正确的thisArg
self
是否(按惯例)表示当前实例。通常代码不够模糊,以至于不清楚(多个实例中的)是哪一个。@Bergi类似地,self可以是任何东西,使用信号(或任何这是实例的东西)只是暗示它是什么。self可能适合于在此时使用不同的对象“类”调用的方法。。。。