मान लीजिए कि आप उपयोग करने के लिए जब आप नए डोम तत्वों को बनाने के एक समारोह है कि आप एक अद्वितीय "आईडी" मान देने के लिए उपयोग कर सकते हैं चाहते हैं । अब, जावा की तरह कुछ में, आप एक आंतरिक निजी काउंटर के साथ एक कक्षा बना सकते हैं, और उसके बाद एक विधि है जो काउंटर को कुछ उपसर्ग स्ट्रिंग में जोड़ती है। खैर, जावास्क्रिप्ट में:
var getId = (function() {
var counter = 0;
return function() {
return "prefix" + counter++;
};
})();
अब चर "getId" एक समारोह है कि एक और समारोह से है बनाया करने के लिए बाध्य है, और इस तरह से यह आमंत्रण के बीच का उपयोग करने के एक लगातार परिवर्तनशील है कि में बनाया जाता है। इसी प्रकार, यदि मैं "getId" कार्यों (जैसे कि, मैं जोड़ सकते हैं DOM तत्व के प्रत्येक प्रकार के लिए एक) के एक परिवार है चाहता था, मैं यह कर सकता है:
var getIdFunc = function(prefix) {
var counter = 0;
return function() {
return prefix + counter++;
};
};
var getId = {
'div': getIdFunc('div'),
'span': getIdFunc('span'),
'dl': getIdFunc('dl'),
// ...
};
अब मैं एक नया पाने के लिए getId.div()
कॉल कर सकते हैं एक नए <div>
के लिए "आईडी" मान। फ़ंक्शन को एक फ़ंक्शन को कॉल करके बनाया गया था जो दो को बंद करने में दिए गए मानों को प्रदान करता है: उपसर्ग स्ट्रिंग (एक तर्क के रूप में पारित) और काउंटर (var
बंद होने के दायरे में घोषित)।
एक बार जब आप इसका उपयोग कर लेंगे, तो सुविधा इतनी लचीली और उपयोगी होगी कि आपको इसके बिना किसी पर्यावरण में वापस जाने में दर्द महसूस होगा।
ओह, और यहाँ एक टिप मदद करने के लिए आप बंद StackOverflow रखने तो आप इस बाहर की कोशिश करनी चाहिए है:
for (var i = 0; i < 10; ++i) {
var id = "foo" + i;
var element = document.getElementById(id);
element.onclick = function() {
alert("hello from element " + i);
};
}
क्या समस्या यहाँ है: यह एक ऐसा मुद्दा है हर समय पॉप अप होता है? खैर, वह "i" वैरिएबल जिसे उस फ़ंक्शन द्वारा संदर्भित किया गया है वह उस क्षेत्र से "i" है जिसमें लूप चलता है। वह चर, आप ध्यान देंगे, लूप के माध्यम से वृद्धि हुई है (duhh, सही?)। खैर, इवेंट हैंडलर के रूप में बनाए गए और असाइन किए गए उन छोटे कार्यों में से प्रत्येक एक साझा करेगा, जो क्लोजर स्कोप में एक ही चर, "i" होगा। ऊप्स! समाधान इस तरह कुछ करने के लिए है:
for (var i = 0; i < 10; ++i) {
var id = "foo" + i;
var element = document.getElementById(id);
element.onclick = (function(iCopy) {
return function() {
alert("hello from element " + iCopy);
};
})(i);
}
हम की एक प्रतिलिपि बनाने बाहरी "i" अपने आप में एक बंद दायरे में है, इसलिए अब प्रत्येक ईवेंट हैंडलर अपनी ही है!
संक्षेप में: लीवरेजिंग बंद करने की तकनीक सभी फ्रेकिंग समय आती है जब आप इसका उपयोग करते हैं। यह त्रुटि मुक्त प्रोग्रामिंग की एक नई वंडरलैंड में एक मुफ्त टिकट नहीं है; मुझे गलत मत समझो। हालांकि, यह एक बहुत उपयोगी और लचीला प्रतिमान है।
काउंटर उदाहरण क्लासिक :) है। – Anshul