जावास्क्रिप्ट में व्यापक रूप से स्वीकृत अन्य कार्यों के तर्क के रूप में बड़े अनाम कार्यों को क्यों पारित किया जाता है?


27

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

हालाँकि, कई जावास्क्रिप्ट पुस्तकालयों (jQuery, d3.js / NVD3.js) सिर्फ कुछ उदाहरणों को देने के लिए, इस तरह से बड़े कार्यों का उपयोग करें।

यह जावास्क्रिप्ट में व्यापक रूप से क्यों स्वीकार किया जाता है? क्या यह एक सांस्कृतिक बात है, या क्या ऐसे फायदे हैं जो मुझे याद आ रहे हैं, जो किसी नामित फ़ंक्शन को घोषित करने की तुलना में उपयोग को अधिक पसंदीदा बना देगा?


1
यह संभवतः क्लोजर का उपयोग करने के लिए बहुत कुछ है । यह बाहरी दुनिया के लिए वास्तविक कार्य को उजागर नहीं करना चाहता है (जो कि यह गुमनाम है) क्यों नहीं करना पड़ सकता है।
रॉबर्ट हार्वे

3
@RobertHarvey दूसरे शब्दों में, यह जावास्क्रिप्ट के लिए एक सार्वजनिक और निजी नहीं है ?
मेसन व्हीलर

2
कई जगहों पर एक बड़ा अनाम फ़ंक्शन एक ब्लॉक की तरह अधिक पढ़ता है और आमतौर पर बहुत अच्छा लगता है एक बार जब आप इसकी आदत डाल लेते हैं। स्कोपिंग नियम भी ब्लॉक महसूस का समर्थन करते हैं।

5
@MasonWheeler: यह आपके दृष्टिकोण पर निर्भर करता है। एक योजना या ECMAScript प्रोग्रामर कह सकता है कि publicऔर privateउचित क्लोजर नहीं होने के लिए वर्कअराउंड हैं।
जॉर्ज डब्ल्यू मित्तग

1
@ रैकेट के लिए JörgWMittag हुर्रे, XKCD 927
मेसन व्हीलर

जवाबों:


23

तीन मुख्य कारण जो मैं सोच सकता हूं:

  1. अभिभावक स्कोप एक्सेस
  2. एकांत
  3. उच्च स्कोप में परिभाषित नामों की कमी

पैरेंट स्कोप एक्सेस: इनलाइन फ़ंक्शन परिभाषाएँ इनलाइन कोड को पैरेंट स्कोप में परिभाषित चर तक पहुँच की अनुमति देती हैं। यह कई चीजों के लिए बहुत उपयोगी हो सकता है और अगर ठीक से किया जाता है तो कोड की मात्रा या जटिलता को कम कर सकता है।

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

गोपनीयता: एक इनलाइन अनाम परिभाषा के अंदर कोड अधिक निजी है और अन्य कोड द्वारा नहीं बुलाया जा सकता है।

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


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

C ++ जैसी भाषाओं में, अधिकांश शायद इसे एक कम-से-आदर्श अभ्यास मानते हैं, जिसमें एक विशाल कार्य होता है जो कई पृष्ठों / स्क्रीन पर फैला होता है। बेशक, C ++ में निर्मित नाम स्थान है, जो माता-पिता के दायरे की पहुंच प्रदान नहीं करता है और इसमें गोपनीयता विशेषताएं हैं, इसलिए यह पूरी तरह से पठनीयता / स्थिरता से प्रेरित हो सकता है, जबकि जावास्क्रिप्ट को गोपनीयता और माता-पिता के दायरे तक पहुंच प्राप्त करने के लिए कोड अभिव्यक्ति का उपयोग करना पड़ता है। इसलिए, जेएस केवल एक अलग दिशा में प्रेरित हुआ प्रतीत होता है और यह भाषा के भीतर कुछ हद तक एक सांस्कृतिक चीज बन जाती है, तब भी जब उस दिशा को प्रेरित करने वाली चीजों को किसी विशिष्ट मामले में जरूरत नहीं होती है।


C ++ डेवलपर के रूप में हाल ही में मेरे बहुत से काम के लिए JS में ले जाया गया, यह उत्तर बहुत मायने रखता है, विशेष रूप से 'पैरेंट स्कोप एक्सेस' पॉइंट - यह वास्तव में आपके कोड को बहुत सरल बनाने की शक्ति रखता है। एक नाइटपिक - C ++, C ++ 11 लैंबडास :) में निश्चित रूप से +1 होने पर पैरेंट स्कोप एक्सेस प्रदान करता है।
कमांडर धनिया सलामंदर

8

बेनामी कार्यों का उपयोग जावास्क्रिप्ट में कई और उद्देश्यों के लिए किया जाता है, क्योंकि वे अधिकांश भाषाओं में हैं।

सबसे पहले, उन्हें नाम स्थान और ब्लॉक स्कूपिंग के लिए उपयोग किया जाता है। जब तक हाल ही में जावास्क्रिप्ट में मॉड्यूल या किसी अन्य प्रकार के नेमस्पेसिंग तंत्र का अभाव है, जिसके कारण मॉड्यूल पैटर्न के माध्यम से उस कार्यक्षमता को प्रदान करने के लिए अनाम कार्यों का उपयोग कर रहा है। इन कार्यों के नामकरण में कोई लाभ नहीं होगा। छोटे पैमाने पर, जावास्क्रिप्ट की कमी के कारण ब्लॉक स्कूपिंग तक हाल ही में, ब्लॉक स्कूपिंग की नकल करने के लिए एक समान पैटर्न का उपयोग किया गया था; सबसे विशेष रूप से छोरों के शरीर में। इस मामले में एक नामित फ़ंक्शन का उपयोग करना सक्रिय रूप से obfuscatory होगा।

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

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

सांस्कृतिक कारक भी हैं और, दूसरों के बीच उपरोक्त कारणों से, अनाम फ़ंक्शन कई अन्य भाषाओं की तुलना में जावास्क्रिप्ट में कहीं अधिक सामान्य हैं और कई अन्य भाषाओं की तुलना में अधिक आराम से / शिथिल रूप से उपयोग किए जाते हैं।


मेरी अपनी, शायद C ++ कोडिंग में भोली संरचनाओं ने कभी-कभी जावास्क्रिप्ट से घटना आधारित कोडिंग और कॉलबैक के सिद्धांतों को std :: function और lambdas के माध्यम से लिया है। मेरे मामले में, यह आंशिक रूप से है क्योंकि मैं C ++ में UI कोड कर रहा हूं और अवरुद्ध संचालन नहीं करना चाहता। मैं उत्सुक हूं कि जब तक भाषा अच्छी तरह से समर्थन करती है, तब तक जावास्क्रिप्ट का अभ्यास किसी के लिए भी उपयोगी है।
कटाना ३१४
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.