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

最佳答案

这整行:

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程序员建议不要使用的函数。

08-19 02:03