It is possible to pass arguments on a parent function to add these arguments on the nested one.
Can you believe this?
One calls this a closure.
Let's start with an easy example without any closure:
// test1
function fTop(a) {
return a;
}
var fake1 = fTop(1);
var fake2 = fTop(2);
alert(fake1 + fake2);
And the result is...?
3 of course!
OK, it was easy.
Let's continue with this new example, a little more astonishing:
// test2
function fTop(a) {
function fMiddle(b) {
return a + b;
}
return fMiddle;
}
var fake1 = fTop(1)(3);
var fake2 = fTop(2)(4);
alert(fake1 + fake2);
I can see you hesitating and saying: "This example can not work".
Ahah!! Of course it works!
The result is: 10.
Why?!
Because the numbers 1 and 2 are the arguments of the fTop() function and the numbers 3 and 4 are the arguments of the fMiddle() function.
So the first step is the fTop() function that returns fMiddle.
This fMiddle acts as a variable that stores the variable 1.
Then the fMiddle() function is executed and the variable a is here, in memory.
So the fMiddle() function is able to return the result of a + b.
To confirm this behaviour, we will create a last example, with 3 levels:
//test3
function fTop(a) {
function fMiddle(b) {
function fBottom(c) {
return a + b + c;
}
return fBottom;
}
return fMiddle;
}
var fake1 = fTop(1)(3)(5);
var fake2 = fTop(2)(4)(6);
alert(fake1 + fake2);And of course it works!
The result is 21.
Of course, all these examples can be done with a different way.
Let's take the test2 sample to retype a new one:
//test2.2
function fTop(a) {
function fMiddle(b) {
return a + b;
}
return fMiddle;
}
var fake1 = fTop(1);
var fake2 = fTop(2);
alert(fake1(3) + fake2(4));
Result: 10.
Maybe a more readable way, or not, depending of your programming vision.
Anyway, a great behaviour of JavaScript ![]()
Add new comment