Javascript:settimeout 递归无限堆栈增加?

Rob*_*ert 3 javascript recursion slideshow

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

my_recursion();

function my_recursion () {
 // cycle the Background image ...
 setTimeout(my_recursion, 3000);
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ren*_*ers 5

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

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

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

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

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