C # की लंबोदर अभिव्यक्ति भी बंद है, लेकिन C # समुदायों या पुस्तकों द्वारा शायद ही कभी चर्चा की जाती है। मैं अधिक से अधिक जावास्क्रिप्ट लोगों और पुस्तकों को इसके बंद होने के बारे में बात करता हूं जितना वे सी # दुनिया में करते हैं। ऐसा क्यों है?
C # की लंबोदर अभिव्यक्ति भी बंद है, लेकिन C # समुदायों या पुस्तकों द्वारा शायद ही कभी चर्चा की जाती है। मैं अधिक से अधिक जावास्क्रिप्ट लोगों और पुस्तकों को इसके बंद होने के बारे में बात करता हूं जितना वे सी # दुनिया में करते हैं। ऐसा क्यों है?
जवाबों:
क्योंकि जावास्क्रिप्ट में नामस्थान जैसी सुविधा नहीं है, और आप सभी प्रकार की वैश्विक वस्तुओं के साथ आसानी से गड़बड़ कर सकते हैं।
इसलिए अपने निष्पादन वातावरण में कुछ कोड को अलग करने में सक्षम होना महत्वपूर्ण है। क्लोजर उसके लिए एकदम सही हैं।
बंद करने के इस उपयोग से सी # जैसी भाषा का कोई मतलब नहीं है जहां आपके पास नाम, वर्ग और इतने पर कोड अलग-थलग करने के लिए और वैश्विक दायरे में सब कुछ नहीं डालते हैं।
जावास्क्रिप्ट कोड के लिए एक बहुत ही सामान्य अभ्यास इसे इस तरह से लिख रहा है:
(function(){
// Some code
})();
जैसा कि आप देख सकते हैं, यह एक गुमनाम फ़ंक्शन घोषणा है, इसके निष्पादन के तुरंत बाद। इस प्रकार, फ़ंक्शन के भीतर परिभाषित सब कुछ बाहर से पहुंचना असंभव है, और आप वैश्विक गुंजाइश को गड़बड़ नहीं करेंगे। इस फ़ंक्शन का निष्पादन संदर्भ तब तक जीवित रहेगा जब तक कुछ कोड इसका उपयोग करता है, जैसे कि इस संदर्भ में परिभाषित नेस्टेड फ़ंक्शन, जिसे आप कॉलबैक या जो भी हो पास कर सकते हैं।
जावास्क्रिप्ट C # की तुलना में बहुत अलग भाषा है। यह ऑब्जेक्ट ओरिएंटेड नहीं है, यह प्रोटोटाइप ओरिएंटेड है। यह अंत में बहुत अलग प्रथाओं की ओर जाता है।
वैसे भी, क्लोजर अच्छे हैं, इसलिए उनका उपयोग करें, यहां तक कि सी # में भी!
संपादित करें: स्टैकओवरफ्लो के चैट पर कुछ चर्चा के बाद, मुझे लगता है कि इस एवर को पहले से तैयार करना होगा।
नमूना कोड में कार्य बंद नहीं है। हालाँकि, यह fucntion स्थानीय चर और नेस्टेड फ़ंक्शन को परिभाषित कर सकता है। इन स्थानीय चर का उपयोग करने वाले सभी नेस्टेड फ़ंक्शन क्लोजर हैं।
यह वैश्विक दायरे को गड़बड़ाने के बिना कार्यों के एक सेट में कुछ डेटा साझा करने के लिए उपयोगी है। यह जावास्क्रिप्ट में बंद करने का सबसे आम उपयोग है।
क्लोजर इस तरह से कुछ डेटा साझा करने की तुलना में अधिक शक्तिशाली हैं, लेकिन आइए यथार्थवादी बनें, अधिकांश प्रोग्रामर को प्रोग्रामिंग प्रोग्रामिंग के बारे में कोई बात नहीं पता है। C # में आपने इस तरह के उपयोग के लिए वर्ग या नाम स्थान का उपयोग किया होगा, लेकिन JS इस कार्य को प्रदान नहीं करता है।
आप ग्लोबल स्कोप को सुरक्षित रखने के बजाय क्लोजर के साथ अधिक कर सकते हैं, लेकिन यह वह है जो आप जेएस स्रोत कोड में देखेंगे।
संभवतः क्योंकि जावास्क्रिप्ट के ऑब्जेक्ट ओरिएंटेशन के लोकप्रिय कार्यान्वयन क्लोजर पर निर्भर करते हैं। आइए एक साधारण उदाहरण देखें:
function counter() {
var value = 0;
this.getValue = function() { return value; }
this.increase = function() { value++; }
}
var myCounter = new counter();
console.log(myCounter.getValue());
myCounter.increase();
console.log(myCounter.getValue());
तरीकों getValue
और increase
वास्तव में बंद कर रहे हैं, चर encapsulating value
।
क्योंकि बहुत से पुस्तकालय जो जावास्क्रिप्ट को 'बीबरेबल' बनाते हैं, उनका उपयोग करते हैं।
तीन लोकप्रिय नाम रखने के लिए, JQuery , प्रोटोटाइप या MooTools पर एक नज़र डालें । उन पुस्तकालयों में से प्रत्येक each
पुनरावृत्ति के पसंदीदा तरीके के रूप में अपने संग्रह के लिए एक विधि प्रदान करता है , जो एक इट्रेटर फ़ंक्शन का उपयोग करता है। बाहरी दायरे में मानों तक पहुँचने पर वह कार्य बंद हो जाएगा:
[1,2,3].each(function(item) {
console.log(item);
});
और यह वहाँ बंद नहीं होता है: अजाक्स में कॉलबैक, एक्सटेज में इवेंट हैंडलिंग, आदि सभी कार्य करते हैं, और यदि आप 100 कोड के साथ अपने कोड को ब्लोट नहीं करना चाहते हैं, जो बिल्कुल एक बार कहा जाता है, तो क्लोजर जाने का रास्ता है।
console.log
बाहरी दायरे में निश्चित है, इसलिए console
'फ्री वैरिएबल' है। और, क्यों, वास्तव में, एक लूप है, जो कुछ भी अलग नहीं है, एक बुरा अभ्यास?
मैं अन्य जवाबों से सहमत हूं कि जावास्क्रिप्ट के साथ "अच्छा" कोडिंग अधिक जोर से बंद होने पर निर्भर है। हालाँकि, इसके अलावा, यह शायद सिर्फ एक सवाल है कि प्रत्येक भाषा में कितनी देर तक यह सुविधा रही है। जावास्क्रिप्ट को मूल रूप से इसके शुरुआती कार्यान्वयन के बाद से बंद कर दिया गया है। दूसरी ओर C # उनके पास केवल 3.0 के बाद से है, जिसे विजुअल स्टूडियो 2008 के साथ रिलीज़ किया गया था।
मेरे द्वारा चलाए जा रहे बहुत से C # प्रोग्रामर अभी भी 2.0 प्रोजेक्ट्स पर काम कर रहे हैं। और भले ही वे 3.0 या 4.0 में काम कर रहे हों, वे अक्सर अभी भी 2.0 मुहावरों का उपयोग कर रहे हैं। मुझे प्यार है; उम्मीद है कि वे C # में बहुत अधिक उपयोग किए जाएंगे क्योंकि अवधारणा C # डेवलपर्स के बीच प्रचारित करती है।
मुख्य कारण यह है कि C # स्टेटिकली टाइप्ड है और फंक्शन में केवल एक ही, पूर्वनिर्धारित वातावरण तक पहुँच है, जो क्लोजर की उपयोगिता को बाधित करता है।
दूसरी ओर, जावास्क्रिप्ट में, ऑब्जेक्ट्स को ऑब्जेक्ट प्रॉपर्टी के रूप में एक्सेस करने और फर्स्ट-क्लास ऑब्जेक्ट्स के रूप में कार्य करने के तरीकों को सक्षम करने के लिए सक्षम किया जाता है, उन्हें अलग-अलग वातावरणों में भी इंजेक्ट किया जा सकता है जो सबरूटीन को अलग-अलग संदर्भों में संचालित करने की अनुमति देता है।
मुझे उनके बारे में जानने का एक कारण यह था क्योंकि जब आप DOM तत्वों (या वास्तव में कुछ भी) के माध्यम से लूप कर रहे हैं, तो आप चर क्षेत्र को "बंद" या "एनकैप्सुलेट" करने में सक्षम होना चाहते हैं। जैसा कि यहां पोस्ट किए गए उदाहरण में: /programming/5606059/how-to-create-closure-in-loop-and-store-it-in-variable-for-later-exition