Closed. This question is opinion-based。它当前不接受答案。












想要改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。

4年前关闭。



Improve this question




我正在重构一些代码,并且想知道在递归函数中传递常量时哪种模式最不占用内存,并且最容易读取。

例如,我可以将每个常量向下传递给下一个递归函数,但是这些参数不是常量不是很明显:
const startFoo = (myArray, isFoo, isBar) => {
  console.log(isFoo, isBar);
  startFoo(myArray, isFoo, isBar);
};

另外,我可以有2个函数,并在第一个函数的结尾处保持常量,但是我很好奇每次调用第一个函数时重新创建第二个函数是否会导致不必要的对象创建和GC:
const startFoo = (myArray, isFoo, isBar) => {
  const foo = myArray => {
    console.log(isFoo, isBar);
    foo(myArray);
  };
  foo(myArray);
};

最后,我可以将其保留在一个函数中,并仅缓存初始值:
const startFoo = (myArray, isFoo, isBar) => {
  if (!startFoo.cache) {
    startFoo.cache = {
      isFoo,
      isBar
    }
  }
  const {isFoo, isBar} = startFoo.cache;
  console.log(isFoo, isBar);
  startFoo(myArray);
};

所有这三个人似乎都将成为即将到来的(这里的)TCO的良好候选人,因此我不认为这会影响决策,但是如果这样做的话,那么也很高兴知道!

最佳答案



有那么重要吗?如果您由于喜欢函数方法而选择循环而不是递归,则所有变量和参数无论如何都是常量。您可以通过查看递归调用并将参数与函数的参数进行比较来判断它们在递归下降中是否保持不变。



不太可能。 Afaik,没有为简单的内联辅助函数实例化任何函数对象,这些内联辅助函数从不用作对象或导出为闭包。至少这是相当琐碎的优化,即使不这样做,GC压力也不会很困难或显着降低性能。
您应该选择这种方法,因为它是最干净,最可维护的。



你最好不要那样做。它在函数中引入了一个额外的条件,这会降低性能,因为它在每个调用中都执行,但是最重要的是,它不必要地使代码复杂化。这也可能是您引入错误的原因-永远不要在基本case1中取消设置.cache,这样无论传递给它们什么,所有调用都将使用相同的常量。同样,您会将常量泄漏到任何人都可以访问它们的全局范围内。

1:诚然,您的演示函数没有基本情况,但请问自己:如果添加了一个,是否会忘记取消设置缓存?

关于javascript - 在递归函数中传递常量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37791600/

10-09 16:38
查看更多