在Javascript Prototype中使用Timer循环

时间:2014-02-14 20:19:49

标签: javascript prototype

以下内容不循环:

function sequencer(){
    //empty for proof of concept
}
sequencer.prototype.start = function(){
    console.log("not looping");
    tid = setTimeout(this.start, 2000);
}

one = new sequencer();
one.start();

以下循环:

function start() {
    console.log("looping");
    tid = setTimeout(start, 2000); 
}

start();

为什么声明为类方法的函数表现不同?

2 个答案:

答案 0 :(得分:3)

这是因为当调用setTimeout中的函数时,其上下文设置为window。它就像被称为:

this.start.call(window)

因此,当再次调用start()时,thiswindow且由于window.start不存在,因此不会再次运行。

你可以这样试试:

setTimeout(this.start.bind(this), 2000);

答案 1 :(得分:1)

当第二次调用this不是定序器实例时,它是窗口对象。创建一个简单的闭包来捕获this

function sequencer(){
    //empty for proof of concept
}
sequencer.prototype.start = function(){
    var that = this;
    console.log("not looping");
    setTimeout(function(){that.start()}, 2000);
}

var one = new sequencer();
one.start();

JS小提琴: http://jsfiddle.net/F4HgD/