2011-09-21 71 views
1

我重複每月的第二個像重複功能執行啓動問題

setInterval(function(){ /* some code */},1000}; 

什麼,立刻換了這樣的功能將被執行第一次的函數執行,然後重複上每隔1秒,我錯過了任何參數?

回答

2

你可能想聲明的功能,運行它,之後設定的時間間隔:

function something() { /* ... */ } // declare function 

something(); // run it now immediately (once) 

setInterval(something, 1000); // set an interval to run each second from now on 
+0

或者只是在函數定義中包含setInterval。 – symcbean

+0

@symcbean:是的,這也是可能的,甚至可能是自我調用功能。 – pimvdb

+0

在你的第二個例子中,你不應該使用'setInterval',你會以很多意想不到的函數調用:)。 – kapa

4

您可以使用自動執行功能:

(function Fos() { 

    //do your stuff here 

    setTimeout(Fos, 1000); 

})(); 

此功能會調用本身,然後設置一個超時在一秒鐘內再次運行。

編輯:再多一點。在我的例子中,我使用了一個命名函數表達式(我使用了名稱「Fos」),它允許我們在函數內部引用函數本身。其他一些示例使用arguments.callee,它甚至不能在ECMAScript 5嚴格模式下工作,並且現在通常不是推薦的做法。您可以在SO問題中閱讀更多關於它的問題Why was the arguments.callee.caller property deprecated in JavaScript?

2

nope。你能做的最好的是:

var worker = function() { /* code */ } 
worker(); 
setInterval(worker, 1000) 

你可以使用一個稍微不同的模式是這樣的:

(function() { 
    /*code*/ 
    setTimeout(arguments.callee, 1000); 
})() 

注意arguments.callee沒有在嚴格模式下不允許的,所以,你可以這樣做:

var worker = function() { 
    /*code*/ 
    setTimeout(worker, 1000); 
} 
worker(); 

後者兩個代碼示例將創建調用自身執行後1000毫秒的功能。有關使用setInterval()setTimeout()鏈之間的差異(優點/缺點),請參閱this link

1

對已經建議的解決方案的其他解決方案是在聲明中返回匿名函數,並在聲明聲明後立即調用該函數。

這樣您不必使用額外的變量,您仍然可以使用由setInterval返回的間隔ID,這意味着您可以稍後使用clearInterval來中止它。

例如, http://jsfiddle.net/mqchen/NRQBK/

setInterval((function() { 
    document.write("Hello "); // stuff your function should do 
    return arguments.callee; 
})(), 1000);