2012-01-04 99 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

相关问题