Javascript 避免“太多递归”错误
基本上我想做的就是Javascript 避免“太多递归”错误,javascript,recursion,tail-recursion,Javascript,Recursion,Tail Recursion,基本上我想做的就是 function a() { // Do stuff that waits for things etc b(a); } function b(f) { f() } 函数a{ba;};函数bf{f;};A. 但过一段时间后,这将导致太多的递归错误。显然,javascript不支持尾部递归,所以这也不起作用。我也不想在这里使用循环,因为我不希望代码立即执行。那么有没有办法做到这一点,或者说这是不可能的 如果以前有人问过,我也很抱歉,我找不到任何有帮助
function a() {
// Do stuff that waits for things etc
b(a);
}
function b(f) {
f()
}
函数a{ba;};函数bf{f;};A.
但过一段时间后,这将导致太多的递归错误。显然,javascript不支持尾部递归,所以这也不起作用。我也不想在这里使用循环,因为我不希望代码立即执行。那么有没有办法做到这一点,或者说这是不可能的
如果以前有人问过,我也很抱歉,我找不到任何有帮助的
编辑:在任何人询问之前,我没有实际使用setTimeout,所以setIntervall不是一个选项
再次编辑:好的,希望这显示出我正在努力做得更好。在等待事情再次完成后,我需要调用相同的代码,而不是将其放入循环中并阻塞程序。因为每次调用a都会在下一次调用之前返回,因此不会发生递归。运行时系统重复地对函数进行单独调用,并且在任何给定时间都不会有多个调用
细分:
在某个地方,您的代码调用
对a的调用会执行一些操作,然后调用setTimeout
系统安排超时,该调用立即返回
对的原始调用完成
100毫秒后,计时器启动,运行时调用
循环在那之后重复
编辑也许我应该更明确一些:递归一词指的是一个过程,其中函数直接或间接地同步调用自身。比如:
function fibonacci(n) {
return fibonacci(n - 1) + fibonacci(n - 2);
}
我们在OP中发布的代码与此完全不同。除非OP遗漏了一些重要的细节,否则不会从该函数中调用。相反,对该函数的引用正在移交给系统。通过该引用进行的调用在原始调用完成后很长很长一段时间才会发生。除非Do stuff中有其他内容,否则不会导致太多的递归错误,因为它不涉及递归。如果不使用setTimeout,为什么要添加此代码???这不是递归,没有任何意义,请澄清您的问题和/或粘贴您的实际代码或其近似值。您是否测试了您发布的代码以更轻松地演示它,并验证它是否会导致递归错误,因为,嗯,它不会。您说过它会导致递归错误;你的意思是说它确实会导致,还是我认为它可能会导致?如果你想改变你的问题,那么删除这个问题,然后发布另一个问题-1删除标志。你不会好奇递归错误从何而来,以及他为什么会发布那些不相关的代码??这是一个奇怪的非问题的非答案。@Rudie如果你知道更多关于“做事情”部分的内容,你应该在评论中发表。否则就没有递归了,别告诉我。告诉OP。没有递归不是为什么会有递归错误的答案吗?。这就是评论存在的原因。让OP澄清,这样他才能得到一个实际的答案。@Rudie OP中的代码不可能产生过多的递归错误。这就是问题所在。@dandavis它根本不是递归的实例。对setTimeout的调用不会立即调用,因此没有递归。