首页 > 解决方案 > Javascript:settimeout递归无限堆栈增加?

问题描述

我的目标是使用 HTML/CSS/JS 制作背景图片的幻灯片。我发现的许多解决方案都促进了这样的事情:

my_recursion();

function my_recursion () {
 // cycle the Background image ...
 setTimeout(my_recursion, 3000);
}

我认为这是不好的风格是错误的吗?我希望在例如循环 1000 时,所有其他 999 个 my_recursion 实例仍然打开/在堆栈上?这不会创建消耗越来越多内存的无限堆栈吗?

或者是否涉及某种智能,例如“如果一个函数最后调用自身,则第 (n-1) 个函数被销毁,包括在其中分配的所有变量”?

标签: javascriptrecursionslideshow

解决方案


由于 setTimeout 的工作方式,这不会导致无休止的堆栈增加,而且恕我直言,它的风格还不错。

setTimeout不保证代码将在给定超时后直接运行。相反,在超时之后,它会将回调推送到“队列”,当堆栈为空时将处理该队列。所以它只会在 my_recursion 返回并且堆栈为空时运行。

如果一个函数最后调用自己 (...)

my_recursion不会在任何地方调用自己。它只是将自己作为参数传递给setTimeout. 之后,它将继续执行,之后直接返回,并从堆栈中弹出。

本演示文稿解释了堆栈和事件队列。


推荐阅读