JavaScript:setTimeout(setInterval)不起作用

标签 javascript settimeout setinterval nested

好吧,基本上我正在创建一个 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/

相关文章:

javascript - 如何使用 setInterval 和clearInterval 进行无限画廊

Javascript - setTimeout/setInterval 在函数之前执行倒计时

javascript - 刷新/重新加载表时,无法连接 td 中的某些行

javascript - 在 magento 中使用 "PIN/ZIP"检查器检查交付是否可用

javascript - 为什么 ObservableArray 对象的访问在子 foreach 中不起作用?

android - 当 iPhone/Android 进入休眠状态时,JavaScript 执行(settimeout 等)会发生什么?

Javascript 增加一个值以及增加它的速度

javascript - 无法调整标签宽度。查询

javascript - jquery 获取/设置 href 协议(protocol)

javascript:简单的倒数计时器问题