2012-01-04 17 views
16

Estoy tratando de llamar a mi función cada 4 segundos, por lo que aumentará un número en vivo. Por alguna razón, sigo recibiendo errores. Aquí está mi código:Tamaño máximo de la pila de llamadas excedido durante una llamada 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

Se da cuenta de que su getNum función() se queda bloqueado en un bucle recursivo derecho sin fin? –

Respuesta

32

Dentro getNum, estás invocando directamente la función getNum, haciendo que la pila de agotamiento. Vuelva a colocar la llamada a la función getNum() con la referencia de funciones 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 
} 

Enlace a la documentación de setTimeout.

+1

¡Ja! Sí, eso eliminó el error, pero eso no hizo que comenzara a aumentar. ¡Imagínate gracias! –

+1

Ahora aumenta. Tienes que asignar la variable 'num'. –

0

Tiene error de sintaxis en el interior setTimeout

setTimeOut(getNum(), 4000); Llamará getNum esperando que devolverá un código a ejecutar (y lo hará recursievly)

manera correcta es setTimeOut('getNum()', 4000); o setTimeOut(function() { getNum(); }, 4000);

+5

Ponerlo entre comillas es *** no *** de la manera correcta. – SomeKittens

8

El problema es su llamada al setTimeout está invocando getNum en lugar de programarlo para su ejecución. Esto lleva a una recursión infinita y un desbordamiento de la pila. Pruebe lo siguiente en lugar

setTimeout(getNum, 4000); 
+9

+1: Sí, seguramente lo llevará a ... ¡Desbordamiento de pila! :] – trejder

3

setTimeOut debe ser setTimeout

Cuestiones relacionadas