2.8 āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻā§ āĻā§āϞā§āĻāĻžāϰ
Closure āĻā§āύ āĻĢāĻžāĻāĻļāύ āύāĻž āĻāĻŦāĻžāϰ āĻĢāĻžāĻāĻļāύāĻ āĻā§āύ closure āύāĻžāĨ¤ Closure āĻšāĻā§āĻā§ āĻĢāĻžāĻāĻļāύā§āϰ āĻāĻŽāύ āĻāĻāĻāĻž āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āϝ⧠āĻŦā§āĻļāĻŋāώā§āĻā§āϝā§āϰ āĻāĻžāϰāĻŖā§ āĻĢāĻžāĻāĻļāύ āĻāĻā§āϏāĻŋāĻāĻŋāĻāĻļāύ āĻļā§āώ āĻšā§ā§ āϝāĻžāĻŦāĻžāϰ āĻĒāϰā§āĻ āϤāĻžāϰ lexical scope āĻ āĻ āĻŦāϏā§āĻĨāĻŋāϤ āϏāĻāϞ variable āĻā§ āĻŽāύ⧠āϰāĻžāĻāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ āĻŦāϞāĻž āϝā§āϤ⧠āĻĒāĻžāϰ⧠āϝ⧠āĻĄāĻŽ āĻĨā§āĻā§ āĻāĻŋāĻā§ āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāĻžāϰ āĻāύā§āϝ⧠āĻāĻŽāϰāĻž āϝ⧠āĻāĻā§āύā§āĻ āĻĢāĻžāĻā§āĻžāϰ āĻāϰāĻŋ āϏā§āĻāĻžāĻ āĻāĻāĻāĻž closureāĨ¤
āĻāĻŋāĻā§ āĻāĻĻāĻžāĻšāϰāĻŖāĻ
function add(a) {
return function (b) {
return a + b;
};
}
let addTen = add(10);
let addSeven = addTen(7);
console.log(addSeven); // 17
āĻāĻŋ āĻšāĻā§āĻā§ āĻāϏāĻŦ?? āĻ āĻŋāĻ āĻāĻā§, āĻāϞā§āύ āĻĻā§āĻāĻŋ āĻā§āĻĄāĻā§āϞā§āĻā§ āĻā§āĻā§āĻā§āĻ-
ā§§āĨ¤ āϝāĻāύ add āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻāϞ āĻšā§ āĻāĻāĻŋ āĻāϰā§āĻāĻāĻŋ āĻĢāĻžāĻāĻļāύāĻā§ return āĻāϰā§āĨ¤
⧍āĨ¤ āĻ āĻĢāĻžāĻāĻļāύāĻāĻŋāϰ āĻāĻā§āϏāĻŋāĻāĻŋāĻāĻļāύ āĻļā§āώ āĻšā§ā§ āϝāĻžā§ āĻāĻŦāĻ āĻŽāύ⧠āϰāĻžāĻā§ āĻ āϏāĻŽā§ āϤāĻžāϰ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ a āĻāϰ āĻā§āϝāĻžāϞ⧠āĻāĻŋ āĻāĻŋāϞāĨ¤
ā§ŠāĨ¤ āϝāĻāύ addTen āĻā§āϰāĻŋā§ā§āĻŦāϞ⧠add āĻĢāĻžāĻāĻļāύāĻā§ āĻāϏāĻžāĻāύ āĻāϰāĻž āĻšā§āĨ¤ āĻāĻāĻŋ āϏāĻŦ āϏāĻŽā§ āĻŽāύ⧠āϰāĻžāĻāĻŦā§ a āĻāϰ āĻā§āϝāĻžāϞ⧠āĻāĻŋ āĻāĻŋāϞ āϝāĻāύ āĻāĻāĻŋāĻā§ āĻāύāĻŋāĻļāĻŋā§āĻžāϞāĻŋ āĻāϞ āĻāϰāĻž āĻšā§ā§āĻāĻŋāϞāĨ¤
ā§ĒāĨ¤ āĻāĻĒāϰā§āϰ addTen āĻā§āϰāĻŋā§ā§āĻŦāϞ āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύāĻā§ āĻŦā§āĻāĻžā§ āϝā§āĻāĻŋ āϏāĻŦ āϏāĻŽā§ āĻā§āϝāĻžāϞ⧠⧧ā§Ļ āϝā§āĻ āĻāϰāĻŦā§ āϝāĻž āĻĒāĻžāĻ āĻžāύ⧠āĻšā§ā§āĻāĻŋāϞāĨ¤
ā§ĢāĨ¤ āϤāĻžāϰ āĻŽāĻžāύ⧠āĻšāϞ āϝāĻāύ addTen āĻā§ āĻāϞ āĻāϰāĻž āĻšā§ ā§ āĻā§āϝāĻžāϞ⧠āĻĻāĻŋā§ā§, āĻāĻāĻŋ ā§§ā§Ļ āĻāϰ āϏāĻžāĻĨā§ ā§ āϝā§āĻ āĻāϰāĻŦā§ āĻāĻŦāĻ ā§§ā§ āϰāĻŋāĻāĻžāϰā§āύ āĻāϰāĻŦā§āĨ¤
āϏā§āϤāϰāĻžāĻ, āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻ āĻāĻā§āĻāĻŋāύ addTen āĻā§ āϝā§āĻāĻžāĻŦā§ āϰāĻžāύ āĻāϰā§āĻ-
function addTen(b) {
return 10 + b;
}
āĻāĻāύ āĻāĻāĻāĻž āĻŽāĻāĻžāϰ āĻāĻĻāĻžāĻšāϰāĻŖ āĻĻā§āĻāĻŦā§āĨ¤ āĻāĻŋāĻāĻžāĻŦā§ āĻāĻŽāϰāĻž āϞā§āĻĒā§āϰ āĻāĻŋāϤāϰ⧠āĻā§āϞā§āĻāĻžāϰ āĻāĻžāϞāĻžāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤ āĻāĻāĻŋ āĻāύā§āĻāĻžāϰā§āĻāĻŋāĻ āĻŦā§āϰā§āĻĄā§āϰ āĻāĻāĻāĻž āĻāĻŽāύ āĻĒā§āϰāĻļā§āύāĨ¤ āύāĻŋāĻā§āϰ āĻā§āĻĄāĻāĻž āĻĻā§āĻā§āύ āĻāĻŦāĻ āĻāĻāĻā§ āĻŽāύ⧠āĻŽāύ⧠āĻāĻŋāύā§āϤāĻž āĻāϰā§āύ āĻāĻāĻžāϰ āĻāĻāĻāĻĒā§āĻ āĻāϤ āĻšāĻŦā§āĨ¤
for (var i = 1; i <= 5; i++) {
setTimeout(() => console.log(i), 1000);
}
// āĻāĻžāĻā§āĻā§āώāĻŋāϤ āĻāĻāĻāĻĒā§āĻāĻ -
// 1
// 2
// 3
// 4
// 5
// āĻāĻŋāύā§āϤ⧠āĻāϏāĻā§ āĻ
āύāĻžāĻāĻžāĻā§āĻā§āώāĻŋāϤ āĻāĻāĻāĻĒā§āĻāĻ-
// 6
// 6
// 6
// 6
// 6
āĻāϏāϞ⧠āĻāĻ āĻāĻāĻāĻĒā§āĻ āĻāϏāĻžāϰ āĻ āύā§āĻ āĻāĻžāϰāĻŖ āĻāĻā§āĨ¤ āϞā§āĻĒā§āϰ āĻŽāĻžāĻā§ āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞ i āĻšāĻā§āĻā§ āĻāĻāĻāĻŋ āĻā§āϞā§āĻŦāĻžāϞ āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞāĨ¤ āϝāĻāύ setTimeout āϰāĻžāύ āĻšā§ āϤāĻžāϰ āĻāĻā§āĻ āϞā§āĻĒ āĻļā§āώ āĻšā§ā§ āϝāĻžā§ āĻāĻŦāĻ āϤāĻžāĻ i āĻā§āϝāĻžāϞ⧠6 āĻšā§ā§ āϝāĻžā§āĨ¤ āϏā§āĻāύā§āϝ⧠āĻĒā§āϰāϤāĻŋ āĻāĻ āϏā§āĻāύā§āĻĄ āĻĒāϰ āĻĒāϰ āĻĒāĻžāĻāĻāĻŦāĻžāϰ 6 āĻĻā§āĻāĻžāĻā§āĻā§āĨ¤ āϝāĻĻāĻŋ āĻŦāĻŋāĻļā§āĻŦāĻžāϏ āύāĻž āĻšā§ āϤāĻžāĻšāϞ⧠āĻā§āĻĄāĻāĻž āϰāĻžāύ āĻāϰāĻžāϰ āĻĒāϰ āĻāĻĒāύāĻžāϰ āĻā§āϞā§āĻŦāĻžāϞ window āĻ āĻŦāĻā§āĻā§āĻāĻāĻž āĻāĻāĻŦāĻžāϰ āĻĻā§āĻā§āύ āϏā§āĻāĻžāύ⧠i āύāĻžāĻŽā§ āĻāĻāĻāĻž āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞ āĻĻā§āĻāϤ⧠āĻĒāĻžāϰāĻŦā§āύ āĻāĻŦāĻ āϤāĻžāϰ āĻā§āϝāĻžāϞ⧠6 āĻšā§ā§ āĻāĻā§āĨ¤
āĻāĻ āϏāĻŽāϏā§āϝāĻžāϰ āϏāĻŽāĻžāϧāĻžāύ āĻāĻŽāϰāĻž IIFE āĻŦāĻž Immediately Invoked Function Expression āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤ āύāĻŋāĻā§ āĻāĻĻāĻžāĻšāϰāĻŖ āĻĻā§āĻā§āĻž āĻšāϞāĻ-
āĻĒāĻĻā§āϧāϤāĻŋ ā§§āĻ
for (var i = 1; i <= 5; i++) {
(function () {
var val = i;
setTimeout(() => console.log(val), 1000);
})();
}
āĻĒāĻĻā§āϧāϤāĻŋ ⧍āĻ
for (var i = 1; i <= 5; i++) {
(function (val) {
setTimeout(() => console.log(val), 1000);
})(i);
}
āĻāĻāĻžāύ⧠āĻāĻŽāϰāĻž āĻāĻāĻāĻž āĻĢāĻžāĻāĻļāύ āϞāĻŋāĻā§ āĻāĻāĻāĻž Scope āϤā§āϰāĻŋ āĻāϰā§āĻāĻŋāĨ¤ āĻĢāĻžāĻāĻļāύāĻāĻŋāĻā§ āĻāĻŽāĻŋāĻĄāĻŋā§ā§āĻāϞāĻŋ āĻāϞ āĻāϰā§āĻāĻŋ āĻāĻŦāĻ āϤāĻžāϰ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰā§āϰ āĻā§āϝāĻžāϞ⧠āĻšāĻŋāϏāĻžāĻŦā§ i āĻā§ āĻĒāĻžāϏ āĻāϰā§āĻāĻŋāĨ¤ āĻāϤ⧠āϏ⧠āĻāĻāύ i āĻāϰ āĻā§āϝāĻžāϞā§āĻā§ āĻŽāύ⧠āύāĻž āϰā§āĻā§ āϏ⧠āĻāĻāύ āϤāĻžāϰ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰā§āϰ āĻā§āϝāĻžāϞā§āĻā§Â āĻŽāύ⧠āϰāĻžāĻāĻŦā§āĨ¤ āĻŽāĻžāύ⧠āĻāĻāύ i āĻāϰ āĻŽāĻžāύ 1, 2 āĻāϰ⧠āϝāĻžāĻā§āĻā§ āĻāĻŦāĻ āϏā§āĻāĻž āĻĨā§āĻā§ āĻāĻāĻāĻž āĻāϞāĻžāĻĻāĻž Scope āϤā§āϰāĻŋ āĻšāĻā§āĻā§ āϝā§āĻāĻžāĻā§ āϏ⧠āĻŽāύ⧠āϰāĻžāĻāĻā§āĨ¤
āĻĒāĻĻā§āϧāϤāĻŋ ā§ŠāĻ
for (let i = 1; i <= 5; i++) {
setTimeout(() => console.log(i), 1000);
}
// Output:
// 1
// 2
// 3
// 4
// 5
āĻ āĻŦāĻļā§āώ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāĻā§āĻā§āώāĻŋāϤ āĻāĻāĻāĻĒā§āĻ āĻĒā§āϞāĻžāĻŽāĨ¤ āϤāĻŦā§ āĻāĻ āĻāĻ āĻĒāϰā§āϝāύā§āϤāĻ āĻāĻĨāĻž āĻšāĻŦā§ āĻĒāϰāĻŦāϰā§āϤā§āϤ⧠āĻ āύā§āϝ āĻā§āύ⧠āĻāĻĒāĻŋāĻ āύāĻŋā§ā§āĨ¤
- for (var count = 1; count <= 5; count++) {Â Â setTimeout(() => console.log(count), 1000);}Â// Output:// 6// 6// 6// 6// 6Â
var āĻā§āĻāϝāĻŧāĻžāϰā§āĻĄ āĻĢāĻžāĻāĻļāύ āϏā§āĻā§āĻĒ āĨ¤ āϤāĻžāĻ āϝāĻāύ āĻāĻŽāϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ āϤā§āϰāĻŋ āĻāϰāĻŋ āĻāĻāĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ āύāĻžāĻŽā§āϰ var āĻā§āĻāϝāĻŧāĻžāϰā§āĻĄ, āĻāĻāĻŋ āϏāĻŦāϏāĻŽāϝāĻŧ āĻāĻāĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞā§āϰ āĻĻāĻŋāĻā§ āύāĻŋāϰā§āĻĻā§āĻļ āĻāϰā§āĨ¤ āĻāĻāĻžāύ⧠āĻāĻŽāϰāĻž āĻ ā§āϝāĻžāϏāĻŋāĻā§āĻā§āϰā§āύāĻžāϏ āĻĢāĻžāĻāĻļāύ āϏā§āĻāĻāĻžāĻāĻŽāĻāĻāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŋāĨ¤ āϏāĻŽāϝāĻŧ āĻļā§āώ āĻšāϞ⧠āĻāĻžāĻāĻŽāĻāĻāĻā§āϰ āĻĒāϰ⧠āĻ ā§āϝāĻžāϏāĻŋāĻā§āĻā§āϰā§āύāĻžāϏāĻāĻžāĻŦā§ āĻāĻžāϰā§āϝāĻāϰ āĻāϰāĻž āĻšāϝāĻŧ, āĻāĻŖāύāĻžāϰ āĻŽāĻžāύ āĻāϤāĻŋāĻŽāϧā§āϝ⧠6 āĻšāϝāĻŧā§ āĻā§āĻā§āĨ¤ āĻāĻžāϰāĻŖ āĻāĻāĻŋ 5 āĻĒāϰā§āϝāύā§āϤ āϞā§āĻĒ āĻāĻžāϞāĻŋāϝāĻŧā§ āϝāĻžāĻŦā§ āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ⧠āĻāϰā§āĻāĻāĻŋ āĻāύāĻā§āϰāĻŋāĻŽā§āύā§āĻ āĻ āĻĒāĻžāϰā§āĻļāύ āĻāĻžāĻāύā§āĻā§āϰ āĻŽāĻžāύ 6 āĻ āĻŦā§āĻĻā§āϧāĻŋ āĻāϰā§āĨ¤ āϤāĻžāĻ āĻāĻāĻŋ āĻĒāĻžāĻāĻāĻŦāĻžāϰā§āϰ āĻāύā§āϝ 6 āĻĒā§āϰāĻŋāύā§āĻ āĻāϰāĻŦā§ āĻāĻŽāϰāĻž āĻā§āϞā§āĻāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻ āϏāĻŽāϏā§āϝāĻž āϏāĻŽāĻžāϧāĻžāύ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ āĨ¤
- āϏā§āϞā§āĻĢ āĻāύāĻā§āĻāĻŋāĻ āĻĢāĻžāĻāĻļāύ⧠āĻā§āϞā§āĻāĻžāϰÂÂÂconst add = (function () {  let counter = 0;  return function () {    counter += 1;    return counter;  };})();Âadd();add();add();Â
- Every closure has three scopes:
Local Scope (Own scope)
Outer Functions Scope
Global ScopeHereâs a series of nested functions, all of which have access to the outer functionsâ scope. In this context, we can say that closures have access to all outer function scopes.ÂÂÂ// global scopevar e = 10;function sum(a) {  return function (b) {    return function (c) {      // outer functions scope      return function (d) {        // local scope        return a + b + c + d + e;      };    };  };};Âconsole.log(sum(1)(2)(3)(4)); // log 20
- āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻā§ āĻā§āϞā§āĻāĻžāϰ āĻāĻŋ?
- āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻā§ āĻā§āϞā§āĻāĻžāϰ āϏā§āĻŦāĻŋāϧāĻž āĻāĻŋ?
āύāĻŋāĻā§āϰ āĻā§āĻĄā§āϰ āĻāĻāĻāĻĒā§āĻ āĻāĻŋ āĻšāĻŦā§?
ÂÂÂconst multiply = (x) => {  return function (y) {    return x * y;  };};Âlet multiply10 = multiply(10);let multiplyFive = multiply10(5);Âconsole.log(multiplyFive);Â- āύāĻŋāĻā§āϰ āĻā§āĻĄā§āϰ āĻāĻāĻāĻĒā§āĻ āĻāĻŋ āĻšāĻŦā§?ÂÂÂfor (var count = 1; count <= 5; count++) {  setTimeout(() => console.log(count), 1000);}