【问题标题】:Leaving recursive functions running forever?让递归函数永远运行?
【发布时间】:2018-11-13 13:14:44
【问题描述】:

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

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

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

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

【问题讨论】:

标签: javascript function loops paradigms


【解决方案1】:

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

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

要深入了解其工作原理,我建议阅读 JS 事件循环和微任务。

【讨论】:

    【解决方案2】:

    这会导致内存泄漏吗?

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

    仍然限制对函数的调用次数是否更好/更清晰?

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

    其他语言会使用这种方法,还是在 JS 世界之外有不同的思维方式?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-05
      • 2022-11-29
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 2018-05-30
      • 1970-01-01
      • 2019-10-18
      相关资源
      最近更新 更多