javascript - Javascript:settimeout递归无限堆栈增加?
问题描述
我的目标是使用 HTML/CSS/JS 制作背景图片的幻灯片。我发现的许多解决方案都促进了这样的事情:
my_recursion();
function my_recursion () {
// cycle the Background image ...
setTimeout(my_recursion, 3000);
}
我认为这是不好的风格是错误的吗?我希望在例如循环 1000 时,所有其他 999 个 my_recursion 实例仍然打开/在堆栈上?这不会创建消耗越来越多内存的无限堆栈吗?
或者是否涉及某种智能,例如“如果一个函数最后调用自身,则第 (n-1) 个函数被销毁,包括在其中分配的所有变量”?
解决方案
由于 setTimeout 的工作方式,这不会导致无休止的堆栈增加,而且恕我直言,它的风格还不错。
setTimeout
不保证代码将在给定超时后直接运行。相反,在超时之后,它会将回调推送到“队列”,当堆栈为空时将处理该队列。所以它只会在 my_recursion 返回并且堆栈为空时运行。
如果一个函数最后调用自己 (...)
my_recursion
不会在任何地方调用自己。它只是将自己作为参数传递给setTimeout
. 之后,它将继续执行,之后直接返回,并从堆栈中弹出。
推荐阅读
- r - for 循环不通过下一个元素
- python - 任务计划程序批处理文件启动 Python 脚本并且随机不产生输出 ~20% 的时间
- reactjs - 当我运行命令纱线时,我不断得到未满足的对等依赖。如何摆脱那些警告
- swiftui - SwiftUI:将 Binding 转换为另一个 Binding
- python - UnicodeEncodeError:“latin-1”编解码器无法在位置 693195 编码字符“\u25bc”:序数不在范围内(256)
- android - 通过我的应用程序使用 WCF。我收到参考端点警告
- python-3.x - 可视化特征图
- java - Groovy / Gradle / Spock:运行测试时出现 IncompatibleClassChangeError
- azure - Azure 应用服务 - 文件完整性监控 (FIM)
- python - 如何比较两个不同数据框中的日期时间