जावास्क्रिप्ट के लिए बंद करना क्यों महत्वपूर्ण है?


16

C # की लंबोदर अभिव्यक्ति भी बंद है, लेकिन C # समुदायों या पुस्तकों द्वारा शायद ही कभी चर्चा की जाती है। मैं अधिक से अधिक जावास्क्रिप्ट लोगों और पुस्तकों को इसके बंद होने के बारे में बात करता हूं जितना वे सी # दुनिया में करते हैं। ऐसा क्यों है?


3
क्योंकि जावास्क्रिप्ट को प्रथम श्रेणी कार्यात्मक भाषा के रूप में माना जाता है और C # एक शास्त्रीय OOP लैंगगॉज है। विभिन्न प्रतिमान, विभिन्न प्रोग्रामिंग शैली।
रेयनोस

1
प्रथम श्रेणी का कार्य होने से भाषा को एक कार्यशील भाषा बना देता है। PHP (5.3 के बाद से), अजगर या डी में प्रथम श्रेणी का कार्य है। क्या आप कहेंगे कि वे कार्यशील भाषाएं हैं? निश्चित रूप से नहीं, और जावास्क्रिप्ट भी।
deadalnix

1
@deadalnix जावास्क्रिप्ट एक बहु-प्रतिमान भाषा है। यह मुख्य रूप से प्रक्रियात्मक, कार्यात्मक और प्रोटोटाइप OO प्रतिमान का समर्थन करता है। यह किसी भी तरह से एक शुद्ध कार्यात्मक भाषा नहीं है, लेकिन आप आसानी से भाषा को झुकाए बिना कार्यात्मक प्रतिमान में जावास्क्रिप्ट लिख सकते हैं। मैं C # और अजगर का भी यही कहना चाहूंगा।
रेयानोस

3
@deadalnix, एक भाषा जो आपको वाई-कॉम्बिनेटर को परिभाषित करने की अनुमति देती है, एक कार्यात्मक भाषा है। परिभाषा से।
तर्क

1
@deadalnix: मुझे लगता है कि यह नीचे आता है यह सवाल है कि भाषा द्वारा क्या दृष्टिकोण को बढ़ावा दिया जाता है। कई जावास्क्रिप्ट चौखटे और मंच हैं (विशेषकर नोड.जेएस और डीओएम (ईवेंट मॉडल)) जो पहले आदेश कार्यों पर बहुत भरोसा करते हैं। PHP में ऐसी विशेषताएं हैं जो बहुत ही प्रोग्रामिंग शैली के लिए अनुमति देती हैं, लेकिन यदि आप मानक एपीआई या कई रूपरेखाओं पर एक नज़र डालते हैं, तो आप देखते हैं कि यह वास्तव में भाषा के मूल में नहीं है।
back2dos

जवाबों:


5

क्योंकि जावास्क्रिप्ट में नामस्थान जैसी सुविधा नहीं है, और आप सभी प्रकार की वैश्विक वस्तुओं के साथ आसानी से गड़बड़ कर सकते हैं।

इसलिए अपने निष्पादन वातावरण में कुछ कोड को अलग करने में सक्षम होना महत्वपूर्ण है। क्लोजर उसके लिए एकदम सही हैं।

बंद करने के इस उपयोग से सी # जैसी भाषा का कोई मतलब नहीं है जहां आपके पास नाम, वर्ग और इतने पर कोड अलग-थलग करने के लिए और वैश्विक दायरे में सब कुछ नहीं डालते हैं।

जावास्क्रिप्ट कोड के लिए एक बहुत ही सामान्य अभ्यास इसे इस तरह से लिख रहा है:

(function(){
    // Some code
})();

जैसा कि आप देख सकते हैं, यह एक गुमनाम फ़ंक्शन घोषणा है, इसके निष्पादन के तुरंत बाद। इस प्रकार, फ़ंक्शन के भीतर परिभाषित सब कुछ बाहर से पहुंचना असंभव है, और आप वैश्विक गुंजाइश को गड़बड़ नहीं करेंगे। इस फ़ंक्शन का निष्पादन संदर्भ तब तक जीवित रहेगा जब तक कुछ कोड इसका उपयोग करता है, जैसे कि इस संदर्भ में परिभाषित नेस्टेड फ़ंक्शन, जिसे आप कॉलबैक या जो भी हो पास कर सकते हैं।

जावास्क्रिप्ट C # की तुलना में बहुत अलग भाषा है। यह ऑब्जेक्ट ओरिएंटेड नहीं है, यह प्रोटोटाइप ओरिएंटेड है। यह अंत में बहुत अलग प्रथाओं की ओर जाता है।

वैसे भी, क्लोजर अच्छे हैं, इसलिए उनका उपयोग करें, यहां तक ​​कि सी # में भी!

संपादित करें: स्टैकओवरफ्लो के चैट पर कुछ चर्चा के बाद, मुझे लगता है कि इस एवर को पहले से तैयार करना होगा।

नमूना कोड में कार्य बंद नहीं है। हालाँकि, यह fucntion स्थानीय चर और नेस्टेड फ़ंक्शन को परिभाषित कर सकता है। इन स्थानीय चर का उपयोग करने वाले सभी नेस्टेड फ़ंक्शन क्लोजर हैं।

यह वैश्विक दायरे को गड़बड़ाने के बिना कार्यों के एक सेट में कुछ डेटा साझा करने के लिए उपयोगी है। यह जावास्क्रिप्ट में बंद करने का सबसे आम उपयोग है।

क्लोजर इस तरह से कुछ डेटा साझा करने की तुलना में अधिक शक्तिशाली हैं, लेकिन आइए यथार्थवादी बनें, अधिकांश प्रोग्रामर को प्रोग्रामिंग प्रोग्रामिंग के बारे में कोई बात नहीं पता है। C # में आपने इस तरह के उपयोग के लिए वर्ग या नाम स्थान का उपयोग किया होगा, लेकिन JS इस कार्य को प्रदान नहीं करता है।

आप ग्लोबल स्कोप को सुरक्षित रखने के बजाय क्लोजर के साथ अधिक कर सकते हैं, लेकिन यह वह है जो आप जेएस स्रोत कोड में देखेंगे।


9
वह बंद नहीं है। आप स्थानीय गुंजाइश बनाने के लिए फ़ंक्शंस का उपयोग करने के लाभ का वर्णन कर रहे हैं।
रेयनोस

2
क्लोजर केवल एक क्लोजर है यदि यह फ्री वैरिएबल पर बंद हो जाता है। यह बताने के लिए भी धन्यवाद कि मुझे नहीं पता कि जावास्क्रिप्ट कैसे काम करता है :)
रेयनोस

2
बल्कि तब मुझे एक शुरुआत कहकर मुझे कम आंकने का सहारा लेकर जावास्क्रिप्ट एसओ चैट रूम में वास्तविक तर्क देने के लिए स्वतंत्र महसूस हुआ । यह चर्चा वास्तव में यहाँ नहीं है, लेकिन मैं खुशी से SO चैट में आपकी गलतफहमी पर चर्चा करूँगा।
रेयानोस

1
Downvoted। जावास्क्रिप्ट बहुत वस्तु उन्मुख है। यह सिर्फ क्लास-आधारित नहीं है, लेकिन ऐसी कार्यक्षमता आसानी से लिखी जाती है। इसमें प्रथम श्रेणी के कार्य होते हैं, यह बंद करने का लाभ उठाता है ताकि यह भारी घटना-संचालित प्रतिमानों के लिए एक प्राकृतिक फिट हो, और इसके लेखक, ब्रेंडन ईच के अनुसार प्रेरणा का एक मुख्य स्रोत, योजना थी। मुझे वास्तव में यकीन नहीं है कि आपको लगता है कि एक कार्यात्मक भाषा क्या है, लेकिन मजेदार बात यह है कि आपको लगता है कि वर्ग-आधारित विरासत किसी भी तरह से महत्वपूर्ण है बजाय पूरी तरह से आवश्यक जब आप कार्यों को पास कर सकते हैं और उन्हें नए संदर्भों में लागू कर सकते हैं।
एरिक रिपेन

2
-1 भी। यह क्लोजर का वर्णन नहीं करता है, यह गुंजाइश का वर्णन करता है।
इजाकाता

12

संभवतः क्योंकि जावास्क्रिप्ट के ऑब्जेक्ट ओरिएंटेशन के लोकप्रिय कार्यान्वयन क्लोजर पर निर्भर करते हैं। आइए एक साधारण उदाहरण देखें:

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


3
-1 "क्लोजर पर निर्भर करता है" यह अत्यधिक व्यक्तिपरक है। ऐसा नहीं होता।
रेयनोस

रेयनोस: हमें यह दिखाने के लिए परवाह है कि निजी सदस्यों को बंद किए बिना कैसे बनाएं और उनका उपयोग करें?
user281377

1
@ammoQ जावास्क्रिप्ट में निजी जैसी कोई चीज नहीं है। आपका मतलब क्या था "क्योंकि जावास्क्रिप्ट शास्त्रीय OO अनुकरण क्लोजर पर निर्भर करता है"। जावास्क्रिप्ट OO प्रोटोटाइप है जो एक अलग प्रतिमान है। यह सवाल का एक अच्छा जवाब है, "हम जावास्क्रिप्ट में क्लोजर का उपयोग करते हैं क्योंकि शास्त्रीय OO का अनुकरण करने की आवश्यकता है"
रेयनोस

1
@keppla मेरा मतलब था "OO क्लोजर पर निर्भर करता है" व्यक्तिपरक है। आपको OO के लिए बंद होने की आवश्यकता नहीं है।
रेयानोस

2
आप मुझे वेश्या के रूप में उजागर कर रहे हैं, मैं ...
14:28

4

क्योंकि बहुत से पुस्तकालय जो जावास्क्रिप्ट को 'बीबरेबल' बनाते हैं, उनका उपयोग करते हैं।

तीन लोकप्रिय नाम रखने के लिए, JQuery , प्रोटोटाइप या MooTools पर एक नज़र डालें । उन पुस्तकालयों में से प्रत्येक eachपुनरावृत्ति के पसंदीदा तरीके के रूप में अपने संग्रह के लिए एक विधि प्रदान करता है , जो एक इट्रेटर फ़ंक्शन का उपयोग करता है। बाहरी दायरे में मानों तक पहुँचने पर वह कार्य बंद हो जाएगा:

[1,2,3].each(function(item) {
   console.log(item);
});

और यह वहाँ बंद नहीं होता है: अजाक्स में कॉलबैक, एक्सटेज में इवेंट हैंडलिंग, आदि सभी कार्य करते हैं, और यदि आप 100 कोड के साथ अपने कोड को ब्लोट नहीं करना चाहते हैं, जो बिल्कुल एक बार कहा जाता है, तो क्लोजर जाने का रास्ता है।


1
यह बंद क्यों नहीं है? console.logबाहरी दायरे में निश्चित है, इसलिए console'फ्री वैरिएबल' है। और, क्यों, वास्तव में, एक लूप है, जो कुछ भी अलग नहीं है, एक बुरा अभ्यास?
कीपला

@ रेयानोस: क्लोजर की मेरी परिभाषा 'ब्लॉक जिसमें एक फ्री वैरिएबल होता है' है, यह उस स्थिति को ढीला नहीं करता है, यह फ्री वैरिएबल टॉप स्कोप पर होता है। लेकिन, मेरी बात का समर्थन करने के लिए, इस विधि पर विचार करें: pastie.org/2144689 । यह बुरा क्यों होना चाहिए?
कीपला

मुझे अभी भी लगता है कि वैश्विक आंकड़ों पर "समापन" धोखा माना जाता है। मैं मानता हूं कि स्कोप चेन तक डेटा एक्सेस करना ठीक है, उस एक्सेस को कम करने के लिए बस अच्छा अभ्यास है।
रेयनोस

कम से कम पहुंच पर सहमत
किपला

यह ध्यान दिया जाना चाहिए कि सरणी पुनरावृत्तियों (forEach, मानचित्र, कम, आदि) के साथ उन्हें बंद होने का शून्य कारण है, उनके पास सभी राज्य सीधे उनके पास हैं। मैं इसे बंद करने के लिए एक विरोधी पैटर्न पर विचार
करूंगा

3

मैं अन्य जवाबों से सहमत हूं कि जावास्क्रिप्ट के साथ "अच्छा" कोडिंग अधिक जोर से बंद होने पर निर्भर है। हालाँकि, इसके अलावा, यह शायद सिर्फ एक सवाल है कि प्रत्येक भाषा में कितनी देर तक यह सुविधा रही है। जावास्क्रिप्ट को मूल रूप से इसके शुरुआती कार्यान्वयन के बाद से बंद कर दिया गया है। दूसरी ओर C # उनके पास केवल 3.0 के बाद से है, जिसे विजुअल स्टूडियो 2008 के साथ रिलीज़ किया गया था।

मेरे द्वारा चलाए जा रहे बहुत से C # प्रोग्रामर अभी भी 2.0 प्रोजेक्ट्स पर काम कर रहे हैं। और भले ही वे 3.0 या 4.0 में काम कर रहे हों, वे अक्सर अभी भी 2.0 मुहावरों का उपयोग कर रहे हैं। मुझे प्यार है; उम्मीद है कि वे C # में बहुत अधिक उपयोग किए जाएंगे क्योंकि अवधारणा C # डेवलपर्स के बीच प्रचारित करती है।


2

मुख्य कारण यह है कि C # स्टेटिकली टाइप्ड है और फंक्शन में केवल एक ही, पूर्वनिर्धारित वातावरण तक पहुँच है, जो क्लोजर की उपयोगिता को बाधित करता है।

दूसरी ओर, जावास्क्रिप्ट में, ऑब्जेक्ट्स को ऑब्जेक्ट प्रॉपर्टी के रूप में एक्सेस करने और फर्स्ट-क्लास ऑब्जेक्ट्स के रूप में कार्य करने के तरीकों को सक्षम करने के लिए सक्षम किया जाता है, उन्हें अलग-अलग वातावरणों में भी इंजेक्ट किया जा सकता है जो सबरूटीन को अलग-अलग संदर्भों में संचालित करने की अनुमति देता है।


1
स्टैटिक टाइपिंग का इससे क्या लेना-देना है? क्लोजर ऑर्थोगोनल हैं।

-1

मुझे उनके बारे में जानने का एक कारण यह था क्योंकि जब आप DOM तत्वों (या वास्तव में कुछ भी) के माध्यम से लूप कर रहे हैं, तो आप चर क्षेत्र को "बंद" या "एनकैप्सुलेट" करने में सक्षम होना चाहते हैं। जैसा कि यहां पोस्ट किए गए उदाहरण में: /programming/5606059/how-to-create-closure-in-loop-and-store-it-in-variable-for-later-exition

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.