2012-12-07 63 views
2

我希望立即運行我在第一時間功能(無超時),所以我這樣做:的setInterval具有自動執行功能

setInterval(function(){ 
    alert("Boo"); 
}(), 1000); 

在第一次,但在接下來的時間間隔執行的功能,什麼都沒有發生。爲什麼?

+1

'setInterval'需要'function'作爲參數。你傳入'undefined'。 (因爲你沒有在自執行功能中返回任何東西) – Shmiddty

+1

這是因爲它被調用,沒有通過。如果你想立即調用,只需給它一個名字,然後返回它。 'setInterval(function foo(){alert(「boo」); return foo;}(),1000);' –

+0

@IHateLazy,你可以請發佈這個答案嗎? –

回答

5

更好的問題是,你究竟在努力實現什麼?

您不需要return任何來自自調函數的內容,因此它將隱式返回undefined值,該值將傳遞到setTimeout。初始呼叫後,線路將類似於

setInterval(undefined, 1000); 

這顯然,是沒有意義的,也不會繼續調用任何東西。

您可能需要從你的自我調用函數return另一個函數,或者根本就沒有使用自調用函數,只是傳過來的函數引用。


更新:

你更新你的問題。如果你想在初始化運行功能「一次」,之後使用它的時間間隔,你可以不喜歡

setInterval((function() { 
    function loop() { 
     alert('Boo'); 
    }; 

    loop(); 
    return loop; 
}()), 1000); 
+0

jHummel似乎知道提問者實際上想要什麼 –

+0

對不起,不好解釋,請再次看到問題。 –

3

設定的時間間隔要求的功能引用,而不是不確定的從函數返回。只需在匿名函數結尾處刪除'()'即可。

+0

你是對的。對不起,我的錯誤解釋,請再次看到問題。 –

2

因爲什麼setInterval「看到」是您的自動執行功能返回 - undefined

試試這個:

setInterval(function() 
     { 
      alert("Boo"); 
      return arguments.callee; 

     }(), 1000); 

注:
正如我恨懶惰指出arguments.calleeStrict Mode不允許的。

+0

相當優雅! – Shmiddty

+1

但是應該指出的是'strict.calee'在嚴格模式下是不允許的。 –

1

您自執行的函數不返回作爲setInterval參數使用功能,所以它調用setInterval前顯示警報,比setInterval基本上是無操作。

如果需要,您可以看到Firefox抱怨空的電話號碼爲setInterval

1

你可以寫這樣的:

setInterval((function() { 
    function boo() { 
     alert("boo"); 
    }; 
    boo(); 
    return boo; 
})(), 1000);​ 

但是我建議你宣佈區間之外的功能。

+1

實際上,您可以命名自執行功能,因此不需要函數內的函數 - 請參閱我的回答 –

3

這是因爲它被調用,沒有通過。如果你想立即調用,只需給它一個名字,然後返回它。

setInterval(function foo() { 
    alert("boo"); 
    return foo; 
}(), 1000); 

這就是所謂的命名函數表達式。您應該知道,在大多數瀏覽器中,foo標識符僅在foo之內可用,但較早的IE會導致標識符泄漏到外部作用域。

這通常不是問題,但在選擇函數名稱時應該注意它。

2

這是我在過去所做的那樣爲我的方法:

(function loop() { 
    // do stuff 
    window.setTimeout(loop, 1000); 
})(); 
+0

此方法對setInterval也是一種更好的方法,因爲它可以防止在每個時間幀內多次觸發函數。 –