ES6立即调用递归箭头函数

use*_*653 11 javascript recursion ecmascript-6 arrow-functions

这是我目前的代码:

const fn = parameter => {
    // if, else ...
    fn(X);
};
fn(0);
Run Code Online (Sandbox Code Playgroud)

现在,我不能使用这种方法,因为我需要使用参数调用函数,并且它必须可递归地调用.

如何重构上面的箭头函数,以便立即调用和递归调用?

Rez*_*eza 11

首先,让我把免责声明立即调用函数表达式(IIFE)视为 ES6中的不良实践,这是尾递归,我个人将其更改为for循环.

但你总能这样做我猜:

((x) =>{ const fn=(p)=>{
       //whatever
       fn(q)
   }
   fn(x)
})(0)
Run Code Online (Sandbox Code Playgroud)

  • 您引用的文章没有在任何地方说 IIFE 是“不好的做法”,也没有为该声明提供任何证据。它仅声明 ECMAScript 2015 的功能可以用作替代方案。 (2认同)

Fel*_*ing 11

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

(function fn(parameter) {
  // if, else ...
  fn(x);
})(0);
Run Code Online (Sandbox Code Playgroud)


Sur*_*yan 3

如果你想调用递归lambda expression或者anonymous function你需要Y 组合器。欲了解更多详细信息,您可以阅读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) );
Run Code Online (Sandbox Code Playgroud)

对于你的代码来说它会像

const fn = (func)=> {

    return (parameter) => {
       // if else
       func(X);
    }
};

Y(fn)(0);
Run Code Online (Sandbox Code Playgroud)