避免过多的递归'错误

时间:2014-10-25 20:41:36

标签: javascript recursion tail-recursion

基本上我正在尝试做的事情归结为

function a() {
    // Do stuff that waits for things etc
    b(a);
}

function b(f) {
    f()
}

function a(){b(a); };函数b(f){f(); };一个() 这会在一段时间后导致过多的递归错误。显然javascript不支持尾递归,因此也无法正常工作。因为我不想立即执行代码,所以我想不出在这里使用循环的任何方法。所以任何方式做到这一点还是不可能?

如果之前有人问过这个问题,我也很抱歉,找不到任何帮助。

编辑:在任何人问之前,不,我实际上并没有使用setTimeout,因此setIntervall不是一个选项。

再次编辑:好吧希望这表明我正在努力做得更好。我需要在等待事情再次完成后调用相同的代码,而不是实际将它放在循环中并阻止程序。

1 个答案:

答案 0 :(得分:2)

因为每次调用a()都会在下次调用之前返回,所以不会进行递归。运行时系统重复对该功能进行单独调用,并且在任何给定时间都不会有多次呼叫。

打破它:

  • 某处,您的代码调用a()来启动循环
  • a()"的调用确实存在问题"然后调用setTimeout()
  • 系统安排超时,并且该呼叫立即返回
  • a()的原始通话完成
  • 100毫秒后,计时器触发,运行时调用a()

此后的循环就会重复。

编辑也许我应该更明确:递归这个词指的是一个函数直接或间接调用自身(同步)的过程。像:

function fibonacci(n) {
  return fibonacci(n - 1) + fibonacci(n - 2);
}

我们在OP中发布的代码中有什么不同。在该函数中没有调用a()(除非OP遗漏了一些重要的细节)。相反,函数的引用正在移交给系统。通过该引用的呼叫不会在原始呼叫结束后很长很长时间内发生。