2016-08-15 74 views
8

这是我当前的代码:现在ES6立即调用递归Arrow功能

const fn = parameter => { 
    // if, else ... 
    fn(X); 
}; 
fn(0); 

,我不能用this approach,因为我需要调用带有参数的功能,它必须是可调用的递归。

如何重构上述箭头函数以立即调用并递归调用?

+0

不要使用箭头功能? –

回答

2

如果你想调用递归的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); 
+0

这可能是对的,但这不是自调用的。我想删除'Y(fn)(0);'。这个解决方案似乎更复杂,但像我的结果一样。 – user3292653

9

首先,让我把免责声明立即调用函数表达式(IIFE)在ES6中是considered bad practice,并且这是尾随式发生的离子和个人,我会改变它为一个for循环。

但你总是可以做到这一点我想:

((x) =>{ const fn=(p)=>{ 
     //whatever 
     fn(q) 
    } 
    fn(x) 
})(0) 
5

JavaScript提供了递归函数一个很好的解决方案:有名函数表达式。因此,我会建议使用,而不是箭头功能:

(function fn(parameter) { 
    // if, else ... 
    fn(x); 
})(0); 
+0

伟大的答案。表明箭头函数并不总是比命名函数表达式更好。 – Reza