递归在 JavaScript 中的影响
Effect of recursion in JavaScript
下面的代码段演示了使用 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();
}
。那么这将是递归,并且确实会崩溃,因为没有设置停止递归的条件。如果添加一些控制逻辑,以便递归停止"合理"数量的深度级别,那就没问题了。
- Javascript em根据窗口/视口尺寸调整大小,不影响文档样式的text/css
- javascript getAttribute是否会影响性能或触发布局
- 更改复选框不影响javascript
- 行之间有空格会影响 JavaScript 代码的性能吗?
- 数字精度如何影响 JavaScript 的性能,或者会影响性能
- 影响JavaScript / CSS的HTML空间格式
- 影响 JavaScript 中的 CSS 元素
- 为什么鼠标移动会影响 Javascript 中的间隔
- 逗号运算符是否会影响 Javascript 中的执行上下文
- “DOCTYPE”是否会影响JavaScript中HTML5功能(如“postMessage”)的使用?
- 为什么在 cosole 之前返回语句.log会影响 JavaScript 中的整个函数
- 渲染引擎延迟会影响javascript中的测量维度
- 影响Javascript加载的最终用户计算因素
- 将值存储在两个变量中并更改其中一个会影响Javascript中的两个变量
- 新关键字如何影响 JavaScript 代码
- Html Doctype标签影响javascript
- inputText的绑定属性如何影响javascript方法
- 我如何使我的导航栏居中,而不影响javascript的移动版本
- 如何影响javascript上的所有类
- 省略分号会影响JavaScript的性能吗?