Vivasoft-logo

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 scope
    var 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);
    }