运行代码,浏览器将显示RangeError。
function hide() {
h -= step;
pp.style.height = h + "px";
setTimeout(hide(), 1);
}
答案 0 :(得分:1)
问题在于这一行:
setTimeout(hide(),1);
不是告诉JavaScript在1毫秒内再次调用hide()
,而是立即实际调用它,并将其返回值传递给setTimeout()
。这会导致无限递归,最终导致堆栈溢出/错误。
要解决此问题,您必须使用问题标题中的任一语法:
但是,在您的特定情况下,我建议使用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()函数的执行。
我假设h
和step
是一些全局变量。
此外,您立即致电hide
并将值传递给setTimeout
。
以超时递归调用函数的正确方法是将函数作为值传递给setTimeout
函数:
setTimeout(hide, 1)
相当于:
setTimeout(function() { hide() }, 1)