When Does It Become a Closure?
As per the closure definition, if inner function accesses the variables of outer function, only then is it called a closure.
The following is not a closure:
var Counter = (function () {
var i = 0;
return { counter : i += 1 };
})();
And this one is just a function inside another function:
function outerFunction() {
var itemA = 10;
function innerFunction() {
var itemB = 20;
}
}
This, however, is a closure:
function outerFunction(itemC) {
var itemA = 10;
function innerFunction(itemD) {
var itemB = 20;
return itemA + itemB + itemC;
}
return innerFunction;
}
Different Ways of Writing a Closure
Using Function Declarations
function outerFunction(outerVariable1) {
var outerVariable2 = 0;
function innerFunction(innerVariable) {
// Accessing outer and inner variables
}
return innerFunction;
}
Using Function Expressions
var outerFunction = function(outerVariable1) {
var outerVariable2 = 0;
var innerFunction = function(innerVariable) {
// Accessing outer and inner variables
}
return innerFunction;
}
Declare & Return Inline
Declaring and returning the function in one line is the common convention when using closures.
function outerFunction(outerVariable1) {
var outerVariable2 = 0;
return function innerFunction(innerVariable) {
// Accessing outer and inner variables
}
}
Assign Anonymous & Run Immediately
var innerFunc = (function() {
var outerVariable1 = 0;
return function innerFunction() {
outerVariable1 += val;
}
})();