0

これが私の問題です:

var slide;
$$('#slides li').each(function(i, n) {
    slide = i;
    setTimeout("initiateSlide()",n * 500)                     
});
function initiateSlide(){
    i = slide;
    alert(i); // pretty much alerts the last one 5 times
}

私は 5 つの異なるスライドを期待しinitiateSlide()ていますが、代わりに最後のスライドを 5 回しか取得しません。

4

2 に答える 2

2

あなたの問題は、initiateSlide() 関数で参照しているグローバル変数 (スライド) が、関数が実行されるまでに最後の変数に設定されることです。おそらく、変数の状態を維持するためにクロージャーを使用したいと思うでしょう。このような:

$$('#slides li').each(function(i, n) {
    setTimeout(function() { initiateSlide(i); }, n * 500)
});
function initiateSlide(i){
    alert(i);
}

注 - これにより、グローバルの必要性も完全になくなります

于 2010-06-09T04:22:35.460 に答える
1

グローバル変数を取り除き、ループ内の各スライドを引数としてinitiateSlide関数に渡すことをお勧めします。

$$('#slides li').each(function(slide, n) {
  setTimeout(function () {
    initiateSlide(slide);
  }, n * 500)                     
});

function initiateSlide(slide){
  alert(slide);
}​

あなたの例では、コールバックが実行されるeach前にループが終了し、関数は最後に反復された要素を使用して呼び出されていました。setTimeoutinitiateSlide

于 2010-06-09T04:22:37.713 に答える