递归在 JavaScript 中的影响

Effect of recursion in JavaScript

本文关键字:影响 JavaScript 递归      更新时间:2023-09-26

下面的代码段演示了使用 JavaScript 的递归调用。

function timedCount()
{
document.getElementById('txt').value=c;
c=c+1;
t=setTimeout("timedCount()",1000);
}

来源来自这里。

我的问题:这不会导致堆栈堆积并随后导致堆栈溢出吗?我知道这肯定会在 Pascal 和 C/C++ 等语言中崩溃。

感谢您对此的任何建议。

这不是真正的递归,因此不会创建深度调用堆栈。


但是,切勿将字符串传递给 setInterval()setTimeout() 。这样做与使用 eval() 一样糟糕,并且一旦使用变量,它就会导致潜在的不可读和可能不安全的代码,因为您需要将它们插入到字符串中而不是传递实际变量。

正确的解决方案是 setTimeout(function() { /* your code *) }, msecs); .这同样适用于setInterval()。如果只想调用一个没有任何参数的函数,也可以直接传递函数名:setTimeout(someFunction, msecs);(注意函数名后面没有()(

因此,在您的情况下,请使用t = setTimeout(timedCount, 1000);

这不是递归,因为您的timedCount()函数没有调用自身,而是调用setTimeout()以要求 JS 在指定的延迟后异步调用timeCount()带有 setTimeout() 的行之后的行 - 在这种情况下只是函数的末尾 - 将立即执行,直到超时后才会暂停或休眠。因此,当您从代码中的其他位置调用timedCount()timedCount()将完成执行并且控制权将返回到代码的其他部分,然后稍后将通过超时再次调用该函数,这再次导致另一个函数被安排在以后执行(依此类推无限(。在任何时候都不会像实际递归那样等待另一个完成执行timedCount()

完成一半。

如果您这样做:

function timedCount() {
   // other code here
   timedCount();
}

。那么这将是递归,并且确实会崩溃,因为没有设置停止递归的条件。如果添加一些控制逻辑,以便递归停止"合理"数量的深度级别,那就没问题了。