好吧,基本上我正在创建一个 Interval 类来处理重复操作。 我有这样的东西:
function Interval(fn, speed) {
this.fn = fn;
this.speed = speed;
this.nt = setInterval(fn, speed);
}
然后我有3种方法:
this.pause = function() {
clearInterval(this.nt);
}
this.start = function() {
this.nt = setInterval(this.fn, this.speed);
return this.nt;
}
this.wait = function(time) {
this.pause();
setTimeout(function() {
this.start();
}, time);
}
问题出现在第三种方法中。 this.pause();
和 this.start();
按预期工作。但是当我将 this.start
嵌套到 setTimeout
函数中时,它停止工作。我不明白为什么。这是一个例子:
var i = 0:
var nt = new Interval(function() {
alert('Itineration: '+ i );
if(i>5);
nt.pause();
setTimeout(nt.start, 2000);
// nt.wait(2000);
}, 500);
既不是nt.wait(2000);
也不是nt.pause(); setTimeout(nt.start, 2000);
正在工作。
最佳答案
超时处理程序中的
this
不是 Interval
对象,它引用的是窗口对象(非严格模式),因此 this.start()
不起作用
一种解决方案是使用 Function.bind() 传递自定义上下文
this.wait = function (time) {
this.pause();
setTimeout(function () {
this.start();
}.bind(this), time);
// setTimeout(this.start.bind(this), time) as @elclanrs suggested
}
关于JavaScript:setTimeout(setInterval)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29114403/