я получил следующую реализацию батут:Понимание оптимизации батут для рекурсивных функций
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.context
и f.args
передаются в качестве аргументов, это свойства, которые явно не могут быть найдены при повторной функции внутри батута, когда я, например, попытаюсь получить доступ и console.log
их. Затем он регистрирует значения undefined
.
Каков механизм этой конкретной реализации, передающей аргументы функции?
Можете ли вы уточнить, что преимущество использования батут, а не просто вызывая функцию «ванили»? –
Javascript не оптимизирует хвостовую рекурсию по умолчанию, поэтому ее действительно легко превысить предел стека и производительность выхлопа. –
Ваш код, кажется, работает нормально, можете ли вы прояснить проблему? –