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!
Asked
Active
Viewed 2.2e+01k times
8 Answers
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));
-
38This 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
-
4Great example. I would add that it's important to note that functions defined inside other functions only exist in that functions scope (unless, of course, you assign a global function to it, as per this example). – Mike Sherov Jul 09 '10 at 12:27
-
5
-
why is that nasty exactly? Seems like it can be a useful alternative to a switch case – Jonathan Laliberte Nov 30 '22 at 13:16
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
-
1A 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));

Naimat Official
- 1
- 1
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)

Jay-R Joseph Gabunada
- 456
- 4
- 14