2013-02-18 94 views
0

我有一個函數的圖像幻燈片,我把它分成10個小格,每個div有圖像的一部分,然後我用這個函數:jQuery的循環錯誤excecuted

function change() 
{ 
    $(document).ready(function(){ 
     for(var i=1,t=0,s="";i<=10;i++) 
     { 
     s= "#img2_" + i; 
     setTimeout(function(){$(s).slideDown(2000)},t); 
     t= t+300; 
     } 
    }); 
} 

我只有一個問題div與i = 10是slideDown,我試圖改變我的最大值,只有與我的div是slideDown。 那麼我的問題是什麼:(

+0

嘗試'變量$ S = $( 「#IMG2 _」 + I) '並使用'$ s.slideDown ...'做出關閉 – mplungjan 2013-02-18 05:01:41

回答

1

當你執行超時時,「s」將等於在循環結束時賦值的值,這是因爲傳遞給setTimeout的函數沒有它的。自己的參考時,則使用 「全球」 參考爲了解決這個問題,創建一個封閉的呼叫周圍的setTimeout這樣的:

function change() { 
    $(document).ready(function(){ 
    for(var i=1,t=0,s="";i<=10;i++) { 
     s= "#img2_" + i; 
     (function(img, delay){ 
     setTimeout(function(){$(img).slideDown(2000)}, delay); 
     })(s, t); 
     t= t+300; 
    } 
    }); 
} 
+0

Tks Spencer Leland。 我試圖弄清楚,你的幫助是關於「自我抽象的匿名函數」,對吧?:D 但是我還是沒有理解爲什麼循環無法正常工作,我有使用該「自我....」, 因爲我認爲我的循環創建每個我,每個我創建一個新的變量s,然後傳遞s到setTimeout功能。 那麼你爲什麼說「這是因爲傳遞給setTimeout的函數沒有它自己對s的引用,而是使用」全局「引用」。 我不明白你的意思,請幫幫我。太棒了! – 2013-02-18 09:48:11

+0

那麼,只有當您使用「var」關鍵字時,纔會創建對變量的引用,如下所示: var s =「#img2_」+ 1; 沒有創建本地引用,您將使用對s的全局引用。因此,在您的原始代碼中,所有s變量在技術上都是相同的,所以當您更改它時,它在任何地方都會改變,包括髮送到setTimeout的函數內部。 – 2013-02-18 15:03:49