ES6立即调用递归箭头函数

时间:2016-08-15 07:21:52

标签: javascript recursion ecmascript-6 arrow-functions

这是我目前的代码:

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

现在,我无法使用this approach,因为我需要使用参数调用该函数,并且它必须以递归方式调用。

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

3 个答案:

答案 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 expressionanonymous 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);