让递归函数永远运行?

Rol*_*rov 1 javascript paradigms loops function

我遇到了一个函数,它的setTimeout内部超时呈指数级增长(timeout *= 2).

let timeout = 10000
function foo() {
    // doSomething without breaking, returning
    setTimeout(foo, timeout)
    timeout *= 2;
}
foo()
Run Code Online (Sandbox Code Playgroud)

看起来这不应该是一个问题,并且直觉上感觉setInterval有点已经做了同样的事情(有一个无限循环,直到它被取消,如果有的话),然而,我的问题在于方法本身.

  • 这是否会导致内存泄漏?
  • 是否更好/更清楚仍然限制对函数的调用次数?
  • 其他语言会使用这种方法,还是JS世界之外有不同的心态?

kor*_*ona 6

这不是递归函数调用.调用setTimeout将导致foo稍后由JavaScript事件循环调用.

此代码不会导致堆栈溢出或任何此类问题.它应该是完全安全的.

为了理解这是如何工作的,我建议阅读JS事件循环和微任务.