1function outer() {
2 var counter = 0; // Backpack or Closure
3 function incrementCounter() {
4 return counter++;
5 }
6 return incrementCounter;
7}
8
9const count = outer();
10count(); // 0
11count(); // 1
12count(); // 2
1function OuterFunction() {
2
3 var outerVariable = 100;
4
5 function InnerFunction() {
6 alert(outerVariable);
7 }
8
9 return InnerFunction;
10}
11var innerFunc = OuterFunction();
1function makeFunc() {
2 var name = 'Mozilla';
3 function displayName() {
4 alert(name);
5 }
6 return displayName;
7}
8
9var myFunc = makeFunc();
10myFunc();
11
1var makeCounter = function() {
2 var privateCounter = 0;
3 function changeBy(val) {
4 privateCounter += val;
5 }
6 return {
7 increment: function() {
8 changeBy(1);
9 },
10 decrement: function() {
11 changeBy(-1);
12 },
13 value: function() {
14 return privateCounter;
15 }
16 }
17};
18
19var counter1 = makeCounter();
20var counter2 = makeCounter();
21alert(counter1.value()); /* Alerts 0 */
22counter1.increment();
23counter1.increment();
24alert(counter1.value()); /* Alerts 2 */
25counter1.decrement();
26alert(counter1.value()); /* Alerts 1 */
27alert(counter2.value()); /* Alerts 0 */
28
1/*A closure is the combination of a function bundled together (enclosed) with references
2to its surrounding state (the lexical environment). In other words, a closure gives you
3access to an outer function’s scope from an inner function. In JavaScript, closures are
4created every time a function is created, at function creation time.*/
5
6function init() {
7 var name = 'Mozilla'; // name is a local variable created by init
8 function displayName() { // displayName() is the inner function, a closure
9 alert(name); // use variable declared in the parent function
10 }
11 displayName();
12}
13init();
14
1var counter = (function() {
2 var privateCounter = 0;
3 function changeBy(val) {
4 privateCounter += val;
5 }
6 return {
7 increment: function() {
8 changeBy(1);
9 },
10 decrement: function() {
11 changeBy(-1);
12 },
13 value: function() {
14 return privateCounter;
15 }
16 };
17})();
18
19console.log(counter.value()); // logs 0
20counter.increment();
21counter.increment();
22console.log(counter.value()); // logs 2
23counter.decrement();
24console.log(counter.value()); // logs 1
25