这是我目前的代码:
const fn = parameter => {
// if, else ...
fn(X);
};
fn(0);
现在,我无法使用this approach,因为我需要使用参数调用该函数,并且它必须以递归方式调用。
如何重构上述箭头函数以立即调用并递归调用?
答案 0 :(得分:10)
首先,让我在ES6中放置立即调用函数表达式(IIFE)considered bad practice的免责声明,这是尾递归,我个人将其更改为for循环。
但你总是这样做我猜:
((x) =>{ const fn=(p)=>{
//whatever
fn(q)
}
fn(x)
})(0)
答案 1 :(得分:8)
JavaScript为递归函数提供了一个很好的解决方案:命名函数表达式。因此我建议使用它而不是箭头功能:
(function fn(parameter) {
// if, else ...
fn(x);
})(0);
答案 2 :(得分:2)
如果您想要递归lambda expression
或anonymous function
,则需要Y combinator。有关详细信息,请参阅http://mvanier.livejournal.com/2897.html
对于阶乘,就像
var Y = (proc) => {
return ((x) => {
return proc((y) => { return (x(x))(y);});
})((x) => {
return proc((y) => { return (x(x))(y);});
});
};
var factorial = (fact) => {
return (n) => {
return (n === 0) ? 1 : n * fact(n-1);
};
};
console.log( Y(factorial)(5) );

对于你的代码,它将像
const fn = (func)=> {
return (parameter) => {
// if else
func(X);
}
};
Y(fn)(0);