我希望立即運行我在第一時間功能(無超時),所以我這樣做:的setInterval具有自動執行功能
setInterval(function(){
alert("Boo");
}(), 1000);
在第一次,但在接下來的時間間隔執行的功能,什麼都沒有發生。爲什麼?
我希望立即運行我在第一時間功能(無超時),所以我這樣做:的setInterval具有自動執行功能
setInterval(function(){
alert("Boo");
}(), 1000);
在第一次,但在接下來的時間間隔執行的功能,什麼都沒有發生。爲什麼?
更好的問題是,你究竟在努力實現什麼?
您不需要return
任何來自自調函數的內容,因此它將隱式返回undefined
值,該值將傳遞到setTimeout
。初始呼叫後,線路將類似於
setInterval(undefined, 1000);
這顯然,是沒有意義的,也不會繼續調用任何東西。
您可能需要從你的自我調用函數return
另一個函數,或者根本就沒有使用自調用函數,只是傳過來的函數引用。
更新:
你更新你的問題。如果你想在初始化運行功能「一次」,之後使用它的時間間隔,你可以不喜歡
setInterval((function() {
function loop() {
alert('Boo');
};
loop();
return loop;
}()), 1000);
jHummel似乎知道提問者實際上想要什麼 –
對不起,不好解釋,請再次看到問題。 –
設定的時間間隔要求的功能引用,而不是不確定的從函數返回。只需在匿名函數結尾處刪除'()'即可。
你是對的。對不起,我的錯誤解釋,請再次看到問題。 –
因爲什麼setInterval
「看到」是您的自動執行功能返回 - undefined
。
試試這個:
setInterval(function()
{
alert("Boo");
return arguments.callee;
}(), 1000);
注:
正如我恨懶惰指出arguments.callee
不Strict Mode不允許的。
相當優雅! – Shmiddty
但是應該指出的是'strict.calee'在嚴格模式下是不允許的。 –
您自執行的函數不返回作爲setInterval
參數使用功能,所以它調用setInterval
前顯示警報,比setInterval
基本上是無操作。
如果需要,您可以看到Firefox抱怨空的電話號碼爲setInterval
。
你可以寫這樣的:
setInterval((function() {
function boo() {
alert("boo");
};
boo();
return boo;
})(), 1000);
但是我建議你宣佈區間之外的功能。
實際上,您可以命名自執行功能,因此不需要函數內的函數 - 請參閱我的回答 –
這是因爲它被調用,沒有通過。如果你想立即調用,只需給它一個名字,然後返回它。
setInterval(function foo() {
alert("boo");
return foo;
}(), 1000);
這就是所謂的命名函數表達式。您應該知道,在大多數瀏覽器中,foo
標識符僅在foo
之內可用,但較早的IE會導致標識符泄漏到外部作用域。
這通常不是問題,但在選擇函數名稱時應該注意它。
這是我在過去所做的那樣爲我的方法:
(function loop() {
// do stuff
window.setTimeout(loop, 1000);
})();
此方法對setInterval也是一種更好的方法,因爲它可以防止在每個時間幀內多次觸發函數。 –
'setInterval'需要'function'作爲參數。你傳入'undefined'。 (因爲你沒有在自執行功能中返回任何東西) – Shmiddty
這是因爲它被調用,沒有通過。如果你想立即調用,只需給它一個名字,然後返回它。 'setInterval(function foo(){alert(「boo」); return foo;}(),1000);' –
@IHateLazy,你可以請發佈這個答案嗎? –