setInterval(" clock()",50)与setInterval(" clock",50)不同?

时间:2016-10-31 06:15:18

标签: javascript

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

enter image description here

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

2 个答案:

答案 0 :(得分:1)

问题在于这一行:

setTimeout(hide(),1);

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

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

  • 仅传递函数名称而不是调用它(此处更好)。
  • 传递lambda函数。
  • 或者在将要评估的字符串内传递调用(应该避免IMO或用lambda表达式替换)。

但是,在您的特定情况下,我建议使用set Timeout(),考虑到您的代码总是很容易及时完成:

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

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

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

答案 1 :(得分:0)

此代码不会终止,因此会创建无限数量的堆栈,从而导致堆栈溢出。

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

if (h < 0) { return }

h小于0时,这将终止hide()函数的执行。

我假设hstep是一些全局变量。

此外,您立即致电hide并将值传递给setTimeout

以超时递归调用函数的正确方法是将函数作为值传递给setTimeout函数:

setTimeout(hide, 1)

相当于:

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