web-dev-qa-db-fra.com

Dépassement de la taille maximale de la pile d'appels pendant un appel setTimeout

J'essaie d'appeler ma fonction toutes les 4 secondes pour incrémenter un numéro en direct. Pour une raison quelconque, je continue à recevoir des erreurs. Voici mon 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>
22
Howdy_McGee

Dans getNum, vous invoquez directement la fonction getNum, provoquant l'épuisement de la pile. Remplacez l'appel de fonction getNum() par la référence de fonction 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
}

Lien vers la documentation de setTimeout .

42
Rob W

Le problème est que votre appel à setTimeout appelle getNum au lieu de le planifier pour exécution. Cela conduit à une récursion infinie et à un débordement de pile. Essayez plutôt ce qui suit

setTimeout(getNum, 4000);
10
JaredPar

setTimeOut doit être setTimeout

4
Hogan