1

嗨,我有递归问题。

我从 wc3 http://www.w3schools.com/jsref/met_win_settimeout.asp遵循了这个例子, 但我的似乎根本不起作用。

function rotateImages(start)
  {
  var a = new Array("image1.jpg","image2.jpg","image3.jpg", "image4.jpg");
  var c = new Array("url1", "url2", "url3", "url4");
  var b = document.getElementById('rotating1');
  var d = document.getElementById('imageurl');
  if(start>=a.length)
      start=0;
  b.src = a[start];
  d.href = c[start];
  window.setTimeout("rotateImages(" + (start+1) + ")",3000);
  }

  rotateImages(0);

Firebug 抛出错误:

rotateImages is not defined
[Break On This Error] window.setTimeout('rotateImages('+(start+1)+')',3000);

但是,如果我将 timeOut 更改为:

window.setTimeout(rotateImages(start+1),3000);

它是递归的,但不知何故延迟不起作用,给了我太多递归(7000 秒)

4

3 回答 3

3

eval应该避免的原因有很多,它打破了范围就是其中之一。将字符串传递给 setTimeout 会导致它eval在计时器用完时被编辑。

你应该传递一个函数。

window.setTimeout(rotateImages(start+1),3000);

rotateImages会立即调用,然后将其返回值传递给setTimeout. 这无济于事,因为rotateImages不返回函数。

你可能想要:

window.setTimeout(rotateImages,3000,[start+1]);

或者创建一个匿名函数,在 start 周围包裹一个闭包并传递它:

window.setTimeout(function () { rotateImages(start + 1); },3000);

后一个选项在浏览器中具有更好的支持。

于 2011-06-08T18:43:24.450 回答
1

试试这个语法:

window.setTimeout(function() {
    rotateImages(start+1);
},3000);

setTimeout()期望函数引用作为第一个参数。简单地将函数调用放在那里会给 te 函数的返回值作为参数,这就是延迟不起作用的原因。但是,您第一次尝试评估字符串是一种很好的方法,但不建议这样做。

于 2011-06-08T18:42:20.600 回答
1

警惕来自 W3Schools 的代码。

其他答案给出了解决方案。我只是补充一点,每次rotateImages调用函数时,您都在重新创建数组并重复 DOM 选择。这是不必要的。

您可以像这样更改代码:

(function() {
    var a = ["image1.jpg","image2.jpg","image3.jpg", "image4.jpg"];
    var c = ["url1", "url2", "url3", "url4"];
    var b = document.getElementById('rotating1');
    var d = document.getElementById('imageurl');

    function rotateImages(start) {
      b.src = a[start];
      d.href = c[start];
      window.setTimeout(function() {
          rotateImages( ++start % a.length );
      }, 3000);
    }

    rotateImages(0);
})();
于 2011-06-08T18:55:54.033 回答