如何延迟JavaScript

时间:2010-11-19 03:15:24

标签: javascript

.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);
  }
}

3 个答案:

答案 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()