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

ただし、タイムアウトを次のように変更すると:

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

再帰的ですが、どういうわけか遅延が機能せず、再帰が多すぎます(1秒で7000)

4

3 に答える 3

3

eval避けるべき理由はたくさんありますが、スコープを壊すことはその1つです。文字列を setTimeout に渡すとeval、タイマーが切れたときに ed になります。

代わりに関数を渡す必要があります。

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

これはrotateImagesすぐに呼び出し、その戻り値を に渡しますsetTimeoutrotateImages関数を返さないため、これは役に立ちません。

あなたはおそらく欲しい:

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()第 1 パラメーターとして関数参照が必要です。そこに関数呼び出しを配置するだけで、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 に答える