这是我当前的代码:现在ES6立即调用递归Arrow功能
const fn = parameter => {
// if, else ...
fn(X);
};
fn(0);
,我不能用this approach,因为我需要调用带有参数的功能,它必须是可调用的递归。
如何重构上述箭头函数以立即调用并递归调用?
这是我当前的代码:现在ES6立即调用递归Arrow功能
const fn = parameter => {
// if, else ...
fn(X);
};
fn(0);
,我不能用this approach,因为我需要调用带有参数的功能,它必须是可调用的递归。
如何重构上述箭头函数以立即调用并递归调用?
如果你想调用递归的lambda expression
或你需要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);
这可能是对的,但这不是自调用的。我想删除'Y(fn)(0);'。这个解决方案似乎更复杂,但像我的结果一样。 – user3292653
首先,让我把免责声明立即调用函数表达式(IIFE)在ES6中是considered bad practice,并且这是尾随式发生的离子和个人,我会改变它为一个for循环。
但你总是可以做到这一点我想:
((x) =>{ const fn=(p)=>{
//whatever
fn(q)
}
fn(x)
})(0)
JavaScript提供了递归函数一个很好的解决方案:有名函数表达式。因此,我会建议使用,而不是箭头功能:
(function fn(parameter) {
// if, else ...
fn(x);
})(0);
伟大的答案。表明箭头函数并不总是比命名函数表达式更好。 – Reza
不要使用箭头功能? –