2012-01-04 137 views
16

我試圖每4秒調用一次函數,以便實時增加一個數字。出於某種原因,我不斷收到錯誤。這裏是我的代碼:在setTimeout調用期間超出最大調用堆棧大小

<html> 
<head> 
<title>Recycle Counter</title> 
<script type="text/javascript"> 
    function rand(from, to) 
    { 
     return Math.floor(Math.random() * (to - from + 1) + from); // Generates random number 
    } 

    var num = rand(10000, 100000); 

    function getNum() // Gets triggered by page load so innerHTML works 
    { 
     document.getElementById('counter').innerHTML = num + 7; 
     setTimeOut(getNum(), 4000); 
    } 
</script> 
</head> 
<body onload="getNum()"> 
    <div id="counter"> 

    </div> 
</body> 
</html> 
+1

你意識到你的函數getNum()會陷入無限遞歸循環嗎? – 2012-01-04 18:20:03

回答

32

裏面getNum,你直接調用getNum功能,引起堆棧用盡。與函數引用getNum替換函數調用getNum()

function getNum() // Gets triggered by page load so innerHTML works 
{ 
    num += 7;  // Increase and assign variable 
    document.getElementById('counter').innerHTML = num; 
    setTimeout(getNum, 4000); // <-- The correct way 
} 

鏈接到的setTimeout文檔。

+1

哈!是的,擺脫了錯誤,但沒有讓它開始遞增。 Ima保持在這謝謝! – 2012-01-04 18:20:34

+1

現在它增加。你必須分配'num'變量。 – 2012-01-04 18:21:45

0

你裏面的setTimeout語法錯誤

setTimeOut(getNum(), 4000);會打電話的getNum期待它會返回一個代碼執行(它會做recursievly)

正確的方法是setTimeOut('getNum()', 4000);setTimeOut(function() { getNum(); }, 4000);

+5

把它放在引號中是不是***的正確方法。 – SomeKittens 2013-02-12 03:49:13

8

問題是您致電setTimeout正在調用getNum而不是安排它執行。這導致無限遞歸和堆棧溢出。請嘗試以下,而不是

setTimeout(getNum, 4000); 
+9

+1:是的,它肯定會導致他... Stack Overflow! :] – trejder 2013-08-08 06:57:22

3

setTimeOut應該setTimeout

相關問題