138

I am wondering if JavaScript supports writing a function within another function, or nested functions (I read it in a blog). Is this really possible?. In fact, I have used these but am unsure of this concept. I am really unclear on this -- please help!

Jonathan Lam
  • 16,831
  • 17
  • 68
  • 94
Red Swan
  • 15,157
  • 43
  • 156
  • 238

8 Answers8

232

Is this really possible.

Yes.

function a(x) {    // <-- function
  function b(y) { // <-- inner function
    return x + y; // <-- use variables from outer scope
  }
  return b;       // <-- you can even return a function.
}
console.log(a(3)(4));
Alexis
  • 5,681
  • 1
  • 27
  • 44
kennytm
  • 510,854
  • 105
  • 1,084
  • 1,005
  • 38
    This method is called currying. – Yekver Nov 29 '14 at 21:45
  • so are functions a type of object? sorry for necro – CiY3 Feb 15 '22 at 00:07
  • @CiY3 They are, [via MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions): "*In JavaScript, functions are first-class objects, because they can have properties and methods just like any other object. What distinguishes them from other objects is that functions can be called. In brief, they are `Function` objects.*" – zcoop98 Oct 31 '22 at 23:14
34

The following is nasty, but serves to demonstrate how you can treat functions like any other kind of object.

var foo = function () { alert('default function'); }

function pickAFunction(a_or_b) {
    var funcs = {
        a: function () {
            alert('a');
        },
        b: function () {
            alert('b');
        }
    };
    foo = funcs[a_or_b];
}

foo();
pickAFunction('a');
foo();
pickAFunction('b');
foo();
Quentin
  • 914,110
  • 126
  • 1,211
  • 1,335
21

Functions are first class objects that can be:

  • Defined within your function
  • Created just like any other variable or object at any point in your function
  • Returned from your function (which may seem obvious after the two above, but still)

To build on the example given by Kenny:

   function a(x) {
      var w = function b(y) {
        return x + y;
      }
      return w;
   };

   var returnedFunction = a(3);
   alert(returnedFunction(2));

Would alert you with 5.

cgp
  • 41,026
  • 12
  • 101
  • 131
16

Yes, it is possible to write and call a function nested in another function.

Try this:

function A(){
   B(); //call should be B();
   function B(){

   }
}
cнŝdk
  • 31,391
  • 7
  • 56
  • 78
user3261767
  • 227
  • 3
  • 3
12

Not only can you return a function which you have passed into another function as a variable, you can also use it for calculation inside but defining it outside. See this example:

    function calculate(a,b,fn) {
      var c = a * 3 + b + fn(a,b);
      return  c;
    }

    function sum(a,b) {
      return a+b;
    }

    function product(a,b) {
      return a*b;
    }

    document.write(calculate (10,20,sum)); //80
    document.write(calculate (10,20,product)); //250
Stefan Gruenwald
  • 2,582
  • 24
  • 30
4

An alternative solution with ES6 to other answers:

const currying = (x) => (y) => x + y;
console.log(currying(5)(3));

will print to console: 8

Sedat Polat
  • 1,631
  • 2
  • 18
  • 28
  • 1
    A great read on this and a reason as to why it is called 'currying' can be found here https://javascript.info/currying-partials#currying-what-for – Andre Dec 13 '21 at 18:25
0
function calculate(num1) {
   // arrow function
   return (num2) => num1 + num2;
}

// Invoke the function
console.log(calculate(4)(6));
0

Is this really possible?

It is very possible. You can do anything with functions in javascript since it is a first class function programming language.

function add(x, y) {
  // we can define another function inside the add function to print our answer
  function print(ans) {
     console.log(ans)
  }
  const ans = x + y
  print(ans)
  return ans
}

add(1, 2)