以下内容不循环:
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();
为什么声明为类方法的函数表现不同?
答案 0 :(得分:3)
这是因为当调用setTimeout
中的函数时,其上下文设置为window
。它就像被称为:
this.start.call(window)
因此,当再次调用start()
时,this
为window
且由于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/