Maximum Call Stack Size Exceeded During a setTimeout Call
Asked Answered
M

3

25

I'm trying to call my function every 4 seconds so it will increment a number live. For some reason I keep getting errors. Here's my code:

<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>
Multiphase answered 4/1, 2012 at 18:17 Comment(1)
You realize that your function getNum() will get stuck in an endless recursive loop right?Cantata
M
44

Inside getNum, you're directly invoking the getNum function, causing the stack to exhaust. Replace the function call getNum() with the function reference 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
}

Link to documentation of setTimeout.

Mckoy answered 4/1, 2012 at 18:18 Comment(4)
Ha! yeah that got rid of the error but that didn't make it start incrementing. Ima keep at it thanks!Multiphase
Now it increases. You have to assign the num variable.Mckoy
What if a getNum function takes arguments?Gilford
@Gilford You can add them like this: setTimeout(getNum, 4000, arg1, arg2, arg3, etc)Chelton
S
10

The problem is your call to setTimeout is invoking getNum instead of scheduling it for execution. This leads to infinite recursion and a stack overflow. Try the following instead

setTimeout(getNum, 4000);
Sandwich answered 4/1, 2012 at 18:20 Comment(0)
A
4

setTimeOut should be setTimeout

Annapolis answered 4/1, 2012 at 18:21 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.