永远离开递归函数运行?
Leaving recursive functions running forever?
我遇到了一个函数,其中有一个 setTimeout
内部,超时呈指数增长 (timeout *= 2)
。
let timeout = 10000
function foo() {
// doSomething without breaking, returning
setTimeout(foo, timeout)
timeout *= 2;
}
foo()
这似乎不是问题,直觉上感觉 setInterval
已经在做同样的事情了 (有一个无限循环,直到它被取消)但是,我的问题在于方法本身。
- 这会导致内存泄漏吗?
- 难道better/clearer还是要限制函数的调用次数吗?
- 其他语言会使用这种方法吗?或者在 JS 世界之外是否有不同的思维方式?
这不是递归函数调用。对 setTimeout
的调用将导致 foo
稍后被 JavaScript 事件循环调用。
此代码不会导致堆栈溢出或任何此类问题。应该是绝对安全的。
要深入了解这是如何工作的,我建议阅读 JS 事件循环和微任务。
这是否会导致内存泄漏?
-如果函数 FOO() 在超时再次调用之前运行完成,则不会。应清除堆栈。
是否better/clearer仍然限制函数的调用次数?
-是的,因为您的超时变量最终会溢出并可能导致意外结果。
其他语言会使用这种方法吗?或者在 JS 世界之外是否有不同的思维方式?
-取决于您使用的 library/language 计时器功能的工作方式。但这似乎是一种增加超时的简单方法和有效方法。
我遇到了一个函数,其中有一个 setTimeout
内部,超时呈指数增长 (timeout *= 2)
。
let timeout = 10000
function foo() {
// doSomething without breaking, returning
setTimeout(foo, timeout)
timeout *= 2;
}
foo()
这似乎不是问题,直觉上感觉 setInterval
已经在做同样的事情了 (有一个无限循环,直到它被取消)但是,我的问题在于方法本身。
- 这会导致内存泄漏吗?
- 难道better/clearer还是要限制函数的调用次数吗?
- 其他语言会使用这种方法吗?或者在 JS 世界之外是否有不同的思维方式?
这不是递归函数调用。对 setTimeout
的调用将导致 foo
稍后被 JavaScript 事件循环调用。
此代码不会导致堆栈溢出或任何此类问题。应该是绝对安全的。
要深入了解这是如何工作的,我建议阅读 JS 事件循环和微任务。
这是否会导致内存泄漏?
-如果函数 FOO() 在超时再次调用之前运行完成,则不会。应清除堆栈。
是否better/clearer仍然限制函数的调用次数?
-是的,因为您的超时变量最终会溢出并可能导致意外结果。
其他语言会使用这种方法吗?或者在 JS 世界之外是否有不同的思维方式?
-取决于您使用的 library/language 计时器功能的工作方式。但这似乎是一种增加超时的简单方法和有效方法。