Mat*_*t K 6 javascript recursion
我正在重构一些代码,并想知道在递归函数中传递常量时,哪种模式占用内存最少且最容易阅读.
例如,我可以将每个常量传递给下一个递归函数,但这些参数是常量并不明显:
const startFoo = (myArray, isFoo, isBar) => {
console.log(isFoo, isBar);
startFoo(myArray, isFoo, isBar);
};
Run Code Online (Sandbox Code Playgroud)
或者,我可以有2个函数,并在第一个的闭包中保持常量,但我很好奇,如果每次调用第一个函数时重新创建第二个函数将导致不必要的对象创建和GC:
const startFoo = (myArray, isFoo, isBar) => {
const foo = myArray => {
console.log(isFoo, isBar);
foo(myArray);
};
foo(myArray);
};
Run Code Online (Sandbox Code Playgroud)
最后,我可以将它保留在一个函数中,并只缓存初始值:
const startFoo = (myArray, isFoo, isBar) => {
if (!startFoo.cache) {
startFoo.cache = {
isFoo,
isBar
}
}
const {isFoo, isBar} = startFoo.cache;
console.log(isFoo, isBar);
startFoo(myArray);
};
Run Code Online (Sandbox Code Playgroud)
所有3人看起来他们都会成为即将到来的(这里是)TCO的好候选人,所以我不认为这会影响决定,但如果确实如此,那也很好!
这些参数是常量并不明显
有那么重要吗?如果您因为喜欢函数式方法而选择递归而不是循环,那么所有变量和参数无论如何都是常量。您可以通过查看递归调用并将参数与函数的参数进行比较来判断它们在递归下降中是否保持不变。
或者,我可以有 2 个函数并在第一个函数的闭包中保留常量,但我很好奇每次调用第一个函数时重新创建第二个函数是否会导致不必要的对象创建和 GC。
不太可能。Afaik,没有为简单的内联辅助函数实例化任何函数对象,这些函数从不用作对象或导出为闭包。至少这是一个相当微不足道的优化,即使不这样做,GC 压力也不会很困难或明显影响性能。
您应该采用这种方法,因为它是最干净且最可维护的。
我可以将其保留在一个函数中,只缓存初始值
你最好不要这样做。它在函数中引入了一个额外的条件,这会损害性能,因为它在每次调用时都会执行,但最重要的是它使代码不必要地复杂化。这也可能是您引入错误的原因 - 您从未.cache在基本情况1中取消设置,因此无论传递给它们的是什么,所有调用都将使用相同的常量。此外,您还将常量泄漏到任何人都可以访问它们的全局范围内。
1:诚然,你的演示函数没有基本情况,但问问自己:如果你添加了一个,你会忘记取消设置缓存吗?
| 归档时间: |
|
| 查看次数: |
575 次 |
| 最近记录: |