.defer(5000)
导致JavaScript出现too much recursion
错误。如何将执行延迟5秒?
rotate: function () {
if (!paused) {
this.show(counter);
counter = counter + 1;
if (counter === Spire.Rotator.data.items.length) {
counter = 0;
}
Spire.Rotator.rotate().defer(5000);
//$.proxy(Spire.Rotator.rotate, Spire.Rotator).defer(delay);
}
}
答案 0 :(得分:5)
整行:
Spire.Rotator.rotate().defer(5000);
错了。由于rotate
之后的括号,你的函数会一次又一次地调用自身(无限递归)。删除括号将解决该问题,但代码可能无法正常工作。要修复代码,请使用浏览器的window.setTimeout
method,它接受一个函数和一个延迟(以毫秒为单位)作为两个参数:
setTimeout(function() {
Spire.Rotator.rotate();
}, 5000);
为什么不只是setTimeout(Spire.Rotator.rotate, 5000);
?原因是该函数中的this
将是window
而不是Spire.Rotator
。 (互联网上有关于此的plenty of information。)为什么不setTimeout("Spire.Rotator.rotate()", 5000);
?这是一种非常过时(不赞成)的方法,可以使用同样的pitfalls of eval方法,这是一些包括Douglas Crockford在内的JavaScript程序员不推荐使用的函数。
答案 1 :(得分:3)
简单地替换它:
Spire.Rotator.rotate().defer(5000);
有了这个:
setTimeout(Spire.Rotator.rotate, 5000);
setTimeout()
是javascript在指定时间后执行某些Javascript代码的本机方式。
答案 2 :(得分:3)
实际上,在你的代码中,defer()永远不会被调用。假设您为Spire.Rotator对象定义的旋转方法是:
rotate() calls rotate() calls rotate() calls rotate() .... [to infinity]
infinity
次呼叫后,infinitieth
呼叫的返回值将调用延迟方法。但是你必须等待infinity
次调用才能完成,需要eternity
秒才能完成。
您需要的是setTimeout()。