क्लोजर एक फ़ंक्शन और उस लेक्सिकल एनवायरनमेंट का संयोजन है जिसमें वह फ़ंक्शन घोषित किया गया था।
function outerFunc() { var name = "TutorialsPoint"; // name outerFunc द्वारा बनाया गया एक लोकल वेरिएबल है return function innerFunc() { // innerFunc() इनर फ़ंक्शन है, एक क्लोजर console.log(name); // पैरेंट फ़ंक्शन में घोषित वेरिएबल का उपयोग करें }; } let f = outerFunc(); f()
outerFunc() एक लोकल वेरिएबल name और एक फ़ंक्शन innerFunc() बनाता है। innerFunc() फ़ंक्शन एक इनर फ़ंक्शन है जो outerFunc() के अंदर परिभाषित है और केवल outerFunc() फ़ंक्शन के बॉडी के भीतर उपलब्ध है।
ध्यान दें कि innerFunc() फ़ंक्शन के अपने कोई लोकल वेरिएबल्स नहीं हैं। हालांकि, चूंकि इनर फ़ंक्शन्स को बाहरी फ़ंक्शन्स के वेरिएबल्स तक पहुंच होती है, innerFunc() पैरेंट फ़ंक्शन outerFunc() में घोषित name वेरिएबल को एक्सेस कर सकता है।
आप देख सकते हैं कि जब outerFunc एक्ज़िक्यूट होना पूरा हुआ तो name स्कोप से बाहर चला गया। लेकिन यदि आप ध्यान से देखें, innerFunc जो लौटाया गया था और f को असाइन किया गया था, अभी भी name वेरिएबल तक पहुंच रखता है। इस प्रकार इनर फंक ने outerFunc के लेक्सिकल स्कोप पर क्लोजर बनाया।
व्यावहारिक उपयोग
प्राइवेट मेथड्स का अनुकरण - Java जैसी भाषाएं मेथड्स को प्राइवेट घोषित करने की क्षमता प्रदान करती हैं, जिसका अर्थ है कि उन्हें केवल उसी क्लास के अन्य मेथड्स द्वारा कॉल किया जा सकता है। JavaScript ऐसा करने का कोई नेटिव तरीका प्रदान नहीं करती, लेकिन क्लोजर्स का उपयोग करके प्राइवेट मेथड्स का अनुकरण करना संभव है।
उदाहरण
var counter = (() => { var privateCounter = 0; let changeBy = (val) => privateCounter += val; return { increment: () => changeBy(1), decrement: () => changeBy(-1), value: () => privateCounter }; })(); console.log(counter.value()); counter.increment(); counter.increment(); console.log(counter.value()); counter.decrement(); console.log(counter.value());
आउटपुट
0 2 1
इवेंट हैंडलर्स के साथ उपयोग
for(let i = 0; i < 4; i++) { button = buttons[i] button.addEventListener("click", alert(i)) }
यदि आपके पास बटन्स कलेक्शन में 4 बटन हैं और इस तरह इवेंट लिसनर्स जोड़ने का प्रयास करते हैं, तो उन बटन्स पर किसी भी क्लिक का परिणाम undefined होगा। ऐसा इसलिए है क्योंकि जब उन्हें कॉल किया जाएगा, तो i अब परिभाषित नहीं होगा। इससे बचने का तरीका i पर क्लोजर बनाना है।
for(let i = 0; i < 4; i++) { button = buttons[i] button.addEventListener("click", () => alert(i)) }