让递归函数永远运行?

时间:2018-06-04 08:43:58

标签: javascript function loops paradigms

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

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

这似乎不应该是一个问题,直觉上感觉像setInterval已经做了同样的事情(有一个无限循环,直到它被取消,如果有的话),但是,我的问题在于方法本身。

  • 这是否可能导致内存泄漏?
  • 是否更好/更清楚仍然限制对函数的调用次数?
  • 其他语言是否会使用此类方法,或者JS世界之外是否存在不同的思维模式?

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:0)

这是否会导致内存泄漏?

- 如果函数FOO()在超时之前运行完成再次调用它,那么否。堆栈应该被清除。

仍然限制对函数的调用次数更好/更清楚吗?

- 是的,因为你的超时变量最终会溢出并可能导致意外的结果。

其他语言是否会使用这种方法,或者JS世界之外是否存在不同的思维模式?

- 取决于计时器功能如何适用于您使用的库/语言。但这似乎是一种增加超时的简单方法和有效方法。