13

This is my current code:

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

Now, I can't use this approach as I need to call the function with a parameter and it must be callable recursively.

How to refactor the above arrow function to be immediately invoked and recursively callable?

1
  • 1
    Don't use an arrow function? Commented Aug 15, 2016 at 13:21

3 Answers 3

19

JavaScript provides a great solution for recursive functions: named function expressions. Hence I would recommend to use that instead of an arrow function:

(function fn(parameter) {
  // if, else ...
  fn(x);
})(0);
Sign up to request clarification or add additional context in comments.

1 Comment

great answer. goes to show that arrow functions are not always better than named function expressions.
12

First, let me put the disclaimer that Immediately-Invoked-Function-Expressions (IIFE) are considered bad practice in ES6, and this is tail-recursion and personally I would change it to a for loop.

but you can always do this I guess:

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

1 Comment

The article you reference doesn't say anywhere that IIFE's are "bad practice", nor does it provide any evidence for that statement. It only states that features of ECMAScript 2015 can be used as an alternative.
3

If you want to call recursive an lambda expression or anonymous function you need Y combinator. For more details you can read http://mvanier.livejournal.com/2897.html

For factorial it is like

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) );

For you code it will be like

const fn = (func)=> {

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

Y(fn)(0);

1 Comment

This may be true, but this isn't self invoked. I'd like to remove the Y(fn)(0);. This solution seems to be a more complex but with the same result like mine.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.