gpt4 book ai didi

javascript - 了解递归函数的蹦床优化

转载 作者:行者123 更新时间:2023-11-30 16:17:11 25 4
gpt4 key购买 nike

我有以下蹦床实现:

function trampoline(f) {
while (f && f instanceof Function) {

f = f.apply(f.context, f.args);

}
return f;
}

它的工作原理类似,例如阶乘:

function factorial(n) {
function recur(n, acc) {
if (n == 0) {
return acc;
} else {
return recur.bind(null, n-1, n*acc);
}
}
return trampoline(recur.bind(null, n, 1));
}

问题是我不明白 f.contextf.args 是如何作为参数传入的,这些属性显然找不到例如,当我尝试访问并 console.log 时,蹦床内的重复函数。然后它记录 undefined 值。

这个传递函数参数的特定实现的机制是什么?

最佳答案

如你所见here ,函数对象没有名为 argscontext 的属性,这就是它们在控制台日志中显示为 undefined 的原因。在函数内部,您可以在 argumentsthis 对象中访问这些值,但在绑定(bind)函数中它们从外部不可见 (或未绑定(bind)的函数)。

您的代码之所以有效,是因为如果函数与参数绑定(bind),则会附加 apply 参数。当您绑定(bind) 函数时,您可以只绑定(bind)上下文 (this) 或上下文和参数。如果您绑定(bind)上下文和参数,当您应用调用该函数时,您传入的参数将附加在参数列表的末尾。在您的特定情况下,您正在做...

f = f.apply(undefined, undefined);

... f 的结果参数将是:

[...parametersWhenTheFunctionWasBound, undefined, undefined]

关于javascript - 了解递归函数的蹦床优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35315612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com