जब हम कोड लिखने के बारे में सोचते हैं, तो हम हमेशा यह सुनिश्चित करना चाहते हैं कि हमारा कोड पढ़ने योग्य हो। हालांकि यह तर्कविरूद्ध लगता है, लेकिन कोड को लिखे जाने की तुलना में कई गुना अधिक पढ़ा जाता है। एक डेवलपर टूलबॉक्स में एक कोर टूल, जिसमें यह सुनिश्चित करने के लिए कि कोड योग्य है **फ़ंक्शन** है।
इसके मूल में, एक फ़ंक्शन कोड का एक ब्लॉक है जिसे हम मांग पर निष्पादित कर सकते हैं। यह उन परिदृश्यों के लिए एकदम सही है जहाँ हमें एक ही कार्य को कई बार करने की आवश्यकता होती है; कई स्थानों पर तर्क की नकल करने के बजाय (जो समय आने पर इसे अपडेट करना कठिन बना देगा), हम इसे एक स्थान पर केंद्रीकृत कर सकते हैं, और जब भी हमें ऑपरेशन की आवश्यकता हो, तब कॉल कर सकते हैं - आप अन्य फंक्शन्स से भी एक फंक्शन को कॉल कर सकते हैं!
एक फंक्शन का नाम रखने की क्षमता भी इतनी ही महत्वपूर्ण है। हालांकि यह भ्रामक प्रतीत हो सकता है, लेकिन नाम कोड के एक सेक्शन का दस्तावेजीकरण करने का एक त्वरित तरीका प्रदान करता है। आप इसे एक बटन पर एक लेबल के रूप में सोच सकते हैं। अगर मैं एक बटन पर क्लिक करता हूं जिसमें लिखा है "टाइमर रद्द करें", मुझे पता है कि यह घड़ी को चलाने से रोकने वाला है।
जब भी हम अपने फ़ंक्शन को कॉल करना (या इनवोक करना) चाहते हैं, हम फ़ंक्शन के नाम के बाद `()` का उपयोग करते हैं। यह ध्यान देने योग्य है कि हमारे फ़ंक्शन को कॉल करने का निर्णय लेने से पहले या बाद में परिभाषित किया जा सकता है; जावास्क्रिप्ट कंपाइलर इसे आपके लिए खोजेगा।
> **नोट:** एक विशेष प्रकार का फ़ंक्शन है जिसे **मेथड** के रूप में जाना जाता है, जिसका आप पहले से ही उपयोग कर रहे हैं! वास्तव में, हमने इसे ऊपर अपने डेमो में देखा था जब हमने `console.log` का उपयोग किया था। जो चीज मेथड को फंक्शन से अलग बनाती है वो है की मेथड एक ऑब्जेक्ट से जुड़ी होती है (हमारे उदाहरण में `console`), जबकि एक फ़ंक्शन फ्री-फ़्लोटिंग है। आप कई डेवलपर्स से इन शब्दों का इस्तेमाल परस्पर करते सुनेंगे।
किसी फ़ंक्शन को अधिक पुन: प्रयोज्य बनाने के लिए आप अक्सर उसमें जानकारी देना चाहेंगे। अगर हम ऊपर अपने `displayGreeting` उदाहरण पर विचार करते हैं, तो यह केवल **Hello, world** प्रदर्शित करेगा। सबसे उपयोगी फ़ंक्शन कोई नहीं बना सकता है। यदि हम इसे थोड़ा और लचीला बनाना चाहते हैं, जैसे किसी व्यक्ति को बधाई देने के लिए व्यक्ति का नाम निर्दिष्ट करने की अनुमति देना, हम एक **पैरामीटर** जोड़ सकते हैं। एक पैरामीटर (जिसे कभी-कभी **आर्गुमेंट** भी कहा जाता है), एक फ़ंक्शन को भेजी जाने वाली अतिरिक्त जानकारी है।
हम अधिक मापदंडों को जोड़कर अपने कार्य को और अधिक लचीला बना सकते हैं। लेकिन क्या होगा अगर हम हर मूल्य को निर्दिष्ट करने की आवश्यकता नहीं चाहते हैं? अपने ग्रीटिंग उदाहरण के साथ रखते हुए, हम आवश्यकता के अनुसार नाम छोड़ सकते हैं (हमें यह जानना होगा कि हम किसका अभिवादन कर रहे हैं), लेकिन हम चाहते हैं कि ग्रीटिंग को वांछित रूप में अनुकूलित किया जाए। यदि कोई इसे अनुकूलित नहीं करना चाहता है, तो हम इसके बजाय एक डिफ़ॉल्ट मान प्रदान करते हैं। एक पैरामीटर को एक डिफ़ॉल्ट मान प्रदान करने के लिए, हम इसे उसी तरह से सेट करते हैं जिस तरह से हम एक चर के लिए मान सेट करते हैं - `parameterName = 'defaultValue'`। एक पूर्ण उदाहरण देखने के लिए:
अब तक हमने जो फ़ंक्शन बनाया है वह हमेशा [कंसोल](https://developer.mozilla.org/docs/Web/API/console) पर आउटपुट करेगा। कभी-कभी यह ठीक वही हो सकता है जिसकी हम तलाश कर रहे हैं, खासकर जब हम फ़ंक्शन बनाते हैं जो अन्य सेवाओं को कॉल करेगा। लेकिन क्या होगा अगर मैं गणना करने और मान प्रदान करने के लिए एक सहायक फ़ंक्शन बनाना चाहता हूं तो मैं इसे कहीं और उपयोग कर सकता हूं?
हम **रिटर्न वैल्यू** का उपयोग करके ऐसा कर सकते हैं। एक वापसी मान फ़ंक्शन द्वारा लौटाया जाता है, और इसे एक चर में संग्रहीत किया जा सकता है, जैसे कि हम एक स्ट्रिंग या संख्या जैसे शाब्दिक मूल्य को संग्रहीत कर सकते हैं।
इस फ़ंक्शन को कॉल करते समय हम एक वैरिएबल में मान संग्रहीत करेंगे। यह उसी तरह है जैसे हम एक वैरिएबल को स्थिर मान (जैसे `const name ='Christopher'`) में सेट करते हैं।
जैसे ही आप अपने प्रोग्रामिंग करियर में आगे बढ़ते हैं, आप ऐसे फंक्शन में आएंगे, जो फंक्शन्स को पैरामीटर के रूप में स्वीकार करते हैं। इस साफ-सुथरी चाल का इस्तेमाल आमतौर पर तब किया जाता है जब हम नहीं जानते कि कब कुछ होने वाला है या पूरा हो रहा है, लेकिन हम जानते हैं कि हमें प्रतिक्रिया में एक ऑपरेशन करने की जरूरत है।
एक उदाहरण के रूप में, [setTimeout](https://developer.mozilla.org/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout) पर विचार करें, जो एक टाइमर शुरू करता है और पूरा होने पर कोड निष्पादित करेगा। हमें यह बताना होगा कि हम किस कोड को निष्पादित करना चाहते हैं। एक समारोह के लिए एक सही काम की तरह लगता है!
आइए एक और नज़र डालें कि हमने क्या बनाया है। हम एक नाम के साथ एक फ़ंक्शन बना रहे हैं जिसका उपयोग एक बार किया जाएगा। जैसे-जैसे हमारा आवेदन अधिक जटिल होता जाता है, हम स्वयं को बहुत सारे कार्य बनाते हुए देख सकते हैं, जिसे केवल एक बार ही कहा जाएगा। यह आदर्श नहीं है। जैसा कि यह पता चला है, हमें हमेशा एक नाम प्रदान करने की आवश्यकता नहीं है!
जब हम एक फ़ंक्शन को एक पैरामीटर के रूप में पारित कर रहे हैं, तो हम पहले से एक बनाने के लिए बाईपास कर सकते हैं और इसके बजाय एक पैरामीटर के हिस्से के रूप में निर्माण कर सकते हैं। हम उसी `function` कीवर्ड का उपयोग करते हैं, लेकिन इसके बजाय हम इसे एक पैरामीटर के रूप में बनाते हैं।
बहुत सारी प्रोग्रामिंग भाषाओं में एक शॉर्टकट (जावास्क्रिप्ट सहित) एक का उपयोग करने की क्षमता है जिसे **एरो** या **फैट एरो** फ़ंक्शन कहा जाता है। यह `=>` के एक विशेष संकेतक का उपयोग करता है, जो एक तीर की तरह दिखता है - इस प्रकार नाम! `=>` का उपयोग करके, हम `function` कीवर्ड को छोड़ सकते हैं।
अब आपने देखा है कि हमारे पास फंक्शन को एक पैरामीटर के रूप में पास करने के तीन तरीके हैं और प्रत्येक का उपयोग करते समय सोच सकते हैं। यदि आप जानते हैं कि आप एक से अधिक बार फ़ंक्शन का उपयोग कर रहे हैं, तो इसे सामान्य रूप से बनाएं। यदि आप इसे केवल एक स्थान के लिए उपयोग कर रहे हैं, तो यह आमतौर पर एक अनाम फ़ंक्शन का उपयोग करने के लिए सबसे अच्छा है।आप फैट एरो फंक्शन्स या अधिक पारंपरिक `फ़ंक्शन` सिंटैक्स का उपयोग करते हैं या नहीं, आप पर निर्भर है, लेकिन आप देखेंगे कि अधिकांश आधुनिक डेवलपर्स` => `पसंद करते हैं।
यह लायक है [एरो फ़ंक्शंस पर थोड़ा और पढ़ना](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Functions/Arrow_functions), क्योंकि वे कोड बेस में उपयोग किए जा रहे हैं। एक फ़ंक्शन लिखने का अभ्यास करें, और फिर इस सिंटैक्स के साथ इसे फिर से लिखना।