【问题标题】:Maximum Call Stack Size Exceeded During a setTimeout Call在 setTimeout 调用期间超出最大调用堆栈大小
【发布时间】:2025-12-23 19:20:34
【问题描述】:

我试图每 4 秒调用一次我的函数,以便实时增加一个数字。出于某种原因,我不断收到错误。这是我的代码:

<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>

【问题讨论】:

  • 您意识到您的函数 getNum() 将陷入无限递归循环,对吧?

标签: javascript html time


【解决方案1】:

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 的文档。

【讨论】:

  • 哈!是的,消除了错误,但这并没有使它开始增加。坚持下去,谢谢!
  • 现在它增加了。您必须分配 num 变量。
  • 如果getNum 函数接受参数怎么办?
  • @parsecer 你可以像这样添加它们:setTimeout(getNum, 4000, arg1, arg2, arg3, etc)
【解决方案2】:

setTimeOut 应该是setTimeout

【讨论】:

    【解决方案3】:

    问题是您对setTimeout 的调用是在调用getNum,而不是安排它执行。这会导致无限递归和堆栈溢出。请尝试以下方法

    setTimeout(getNum, 4000);
    

    【讨论】: