2012-10-12 56 views
-1

下面的代碼是從「通過實例第二版的JavaScript」,我認爲下面的代碼是更好setTimeout和setInterval哪個更好?

function scroller() { 
    str = str.substring(1, str.length) + str.substring(0, 1); 
    document.title = str; 
    window.status = str; 
} 
setInterval(scroller, 300); 

的舊代碼是遞歸的,並會繼續下去,直到節目結束調用自身每0.3秒,我想舊的代碼可能會導致堆棧溢出,對吧?

<html> 
<!-- This script is a modification of a free script found at 
the JavaScript source. 
Author: Asif Nasir ([email protected]) 
--> 
<head> 
    <script type="text/javascript"> 
     var today = new Date(); 
     var year = today.getFullYear(); 
     var future = new Date("December 25, " + year); 
     var diff = future.getTime() - today.getTime(); 
     // Number of milliseconds 
     var days = Math.floor(diff/(1000 * 60 * 60 * 24)); 
     // Convert to days 
     var str = 
     "Only " + days + " shopping days left until Christmas!"; 
     function scroller() { 
      str = str.substring(1, str.length) + str.substring(0, 1); 
      document.title = str; 
      window.status = str; 
      setTimeout(scroller, 300); // Set the timer 
     } 
    </script> 
</head> 
<body onload="scroller()"> 
    <b> 
     <font color="green" size="4"> 
Get Dizzy. Watch the title bar and the status bar!! 
<br /> 
<image src="christmasscene.bmp"> 
</font> 
</body> 
</html> 
+3

他們是不同的功能......真正的問題是什麼? – jeremy

+0

什麼是「更好」的標準? – RobG

回答

1

setInterval如果您不太關心準確性,投票滿足某些條件。

setTimeout如果您想要一次性事件或需要調整呼叫之間的時間間隔,一個時鐘應該儘可能接近地在下一整秒之後更新。

兩者都可用於以大約指定的時間間隔連續運行的事件,兩者都可以取消,兩者都只能在指定的時間間隔後(儘快)運行。

順便提一下,OP中的第一個代碼示例不應該導致堆棧溢出,儘管它不是很好編寫。

+0

謝謝!在其他計算機語言中,遞歸函數可能導致堆棧溢出,爲什麼Javascript在運行時不會導致堆棧溢出? – HelloCW

+2

@ user828896 *'setTimeout'和'setInterval'都不會導致遞歸堆棧溢出。在事件分派器(從中調用回調)中堆棧被有效地展開。 – 2012-10-12 02:45:39

+0

@ user828896 -setTimeout和setInterval在典型意義上不是遞歸的,它們被放在堆棧上並執行。你可以通過閉包創建一個巨大的作用域鏈,但這裏沒有任何現代腳本引擎能夠很容易地處理這個問題。這兩種功能都已經有很長時間了,所以現在應該進行優化。 – RobG

1

看一看這裏:

'setInterval' vs 'setTimeout'

的setTimeout超時後,一旦運行該代碼/功能

的setInterval運行在間隔代碼/功能,具有 它們之間的超時長度。

對於你在做什麼,你應該使用setInterval。

+0

我通常喜歡用setTimeout來使用「re-prime」;它可以避免必須跟蹤定時器ID,如果需要取消。 – 2012-10-12 02:38:06