Javascript setInterval(“时钟()”,50)不同于setInterval(“时钟(),50”)和;

Javascript setInterval(“时钟()”,50)不同于setInterval(“时钟(),50”)和;,javascript,Javascript,运行代码时,浏览器将显示RangeError function hide() { h -= step; pp.style.height = h + "px"; setTimeout(hide(), 1); } 此代码不会终止,因此它会创建无限多个堆栈,从而导致堆栈溢出 考虑添加一些终止逻辑,如: if (h < 0) { return } 这相当于: setTimeout(function() { hide() }, 1) 问题在于这一行: setTimeo

运行代码时,浏览器将显示RangeError

function hide() {
    h -= step;
    pp.style.height = h + "px";
    setTimeout(hide(), 1);
}


此代码不会终止,因此它会创建无限多个堆栈,从而导致堆栈溢出

考虑添加一些终止逻辑,如:

if (h < 0) { return }
这相当于:

setTimeout(function() { hide() }, 1)

问题在于这一行:

setTimeout(hide(),1);
实际上,您并没有告诉JavaScript在1毫秒内再次调用
hide()
,而是立即调用它,只将其返回值传递给
setTimeout()
。这会导致无限递归,最终导致堆栈溢出/错误

要解决此问题,您必须使用问题标题中的任一语法:

  • 只传递函数名,而不是调用它(这里更好)
  • 传递lambda函数
  • 或者在将要求值的字符串中传递调用(应该避免IMO或用lambda表达式替换IMO)
但是,在您的特定场景中,我建议使用
set Timeout()
,考虑到您的代码总是很容易及时完成:

// Start the while thing
var handle = setInterval(hide, 1);

// Actual function
function hide()
{
    // Do stuff

    // End condition
    if (done)
        clearInterval(handle);
}

米奇麦和四叶神-我确信这是一个重复的东西,但不是相关的问题。问题标题有误导性——它没有反映屏幕截图中显示的代码,这是一个无限递归问题。不要发布图像,发布文本。请参阅。我不理解标题,完整代码(具有
h
step
vars)未显示。考虑编辑这个问题。虽然我的回答可能会对你有所帮助。问题标题中只有一些不应该与给定代码匹配的附加引号。也许这是这里唯一的不一致之处?虽然这在某些情况下会有所帮助,但它并不能解决实际问题:函数应该在一个时间间隔内调用,但实际上它是一个立即发生的递归调用。
// Start the while thing
var handle = setInterval(hide, 1);

// Actual function
function hide()
{
    // Do stuff

    // End condition
    if (done)
        clearInterval(handle);
}