तत्काल समारोह आह्वान वाक्यविन्यास


110

एक JSLint विकल्प है, वास्तव में अच्छे भागों में से एक है, कि "[आवश्यकता] तत्काल चालान के आसपास" अर्थ, निर्माण

(function () {

  // ...

})();

इसके बजाय के रूप में लिखा जाना चाहिए

(function () {

  // ...

}());

मेरा प्रश्न यह है - क्या कोई समझा सकता है कि इस दूसरे रूप को बेहतर क्यों माना जा सकता है? क्या यह अधिक लचीला है? कम त्रुटि-प्रवण? पहले रूप में इसका क्या फायदा है?


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

var someVar = (function () {

  // ...

}());

हालांकि बाहरी कोष्ठक वाक्य-रचना में अनावश्यक रूप से अनावश्यक होते हैं, उद्घाटन कोष्ठक यह संकेत देता है कि असाइन किया जा रहा मान स्वयं फ़ंक्शन नहीं है, बल्कि फ़ंक्शन के परिणाम को लागू किया जा रहा है।

यह निर्माण कार्यों के पूंजीकरण के बारे में क्रॉकफोर्ड की सलाह के समान है - यह स्रोत कोड को देखने वाले किसी व्यक्ति के लिए दृश्य क्यू के रूप में सेवा करने के लिए है।


इस पर ध्यान दिलाने के लिए धन्यवाद। मुझे JSLint के चेतावनी संदेश से छुटकारा पाने का कोई तरीका कभी नहीं मिला "लूप के भीतर कार्य करते समय सावधान रहें।" मैं सावधान था, और समारोह को बंद कर दिया लेकिन जेएसएलआईएनटी ने फिर भी शिकायत की। अब मुझे पता है कि यह माना जाता है कि मैंने दूसरे पैटर्न का उपयोग किया है।
viam0Zah


मैं यह सब "गलत" कर रहा हूं। और जब मैं कहता हूं "यह सब समय," मैं 1995 से जावास्क्रिप्ट लिख रहा हूं।
डेव लैंड

जवाबों:


73

डौगल क्रॉकफोर्ड के स्टाइल कन्वेंशन गाइड से : ("तुरंत आमंत्रित" के लिए खोज करें)

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

इसलिए, मूल रूप से, उन्हें लगता है कि यह फ़ंक्शन मानों और कार्यों के मूल्यों के बीच अंतर को अधिक स्पष्ट करता है। इसलिए, यह एक शैलीगत मामला है, कोड में वास्तव में एक महत्वपूर्ण अंतर नहीं है।

अद्यतन संदर्भ, पुराना PPT अब मौजूद नहीं है


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

2
@altCognito, क्या आप PPT के लिए एक ताज़ा लिंक प्रदान कर सकते हैं?
th1rdey3

1
मैंने वेब के माध्यम से देखा, लेकिन मुझे अभी भी उस पीपीटी की एक प्रति नहीं मिली
Forethinker

1
मुझे मूल PPT नहीं मिला, लेकिन मैं उनके जावास्क्रिप्ट कन्वेंशन गाइड में पाया गया समान बिंदु खोजने में सक्षम था।
cgp

आर्काइव.ऑर्ग के पास है?
जॉन ग्रीन

2

तुरंत कॉल किए गए बेनामी फ़ंक्शंस इसे परेंस में लपेटते हैं क्योंकि:

  1. वे फंक्शन एक्सप्रेशन हैं और पैरेंस को छोड़ने के कारण इसे फ़ंक्शन डिक्लेरेशन के रूप में व्याख्या किया जा सकता है जो एक सिंटैक्स त्रुटि है।

  2. फ़ंक्शन अभिव्यक्तियाँ शब्द फ़ंक्शन से शुरू नहीं हो सकती हैं।

  3. फ़ंक्शन अभिव्यक्ति को एक चर में असाइन करते समय, फ़ंक्शन स्वयं नहीं लौटाया जाता है, फ़ंक्शन का रिटर्न मान वापस किया जाता है, इसलिए परगनों का मूल्यांकन है कि उनके अंदर क्या है और एक मूल्य का उत्पादन करें।जब फ़ंक्शन निष्पादित होता है, और अनुगामी पार्न्स ..}()फ़ंक्शन को तुरंत निष्पादित करने का कारण बनता है।


दथन, आप एक अलग सवाल का जवाब दे रहे हैं। आप सही हैं कि घेरने वाले कोष्ठक कभी-कभी क्रमिक रूप से आवश्यक होते हैं ताकि पार्सर फ़ंक्शन की अभिव्यक्तियों से फ़ंक्शन के भावों को अलग कर सके। लेकिन मेरा सवाल आह्वान कोष्ठकों की नियुक्ति के बारे में है। आप तीसरा बिंदु गलत हैं; घेरने वाले कोष्ठक उस मामले में अनावश्यक हैं।
बॉबी ईखॉफ

मैं आपके पहले उदाहरण का जवाब दे रहा था जहाँ तत्काल नामांकित फ़ंक्शन को एक चर में नहीं सौंपा गया था और इसलिए पहले 2 कारणों से कोष्ठक वाक्य रचना के लिए आवश्यक है। 3 कारण सिर्फ वही बताया गया था जो आपने यहां तक ​​कहा था: "उद्घाटन कोष्ठक एक संकेत देता है कि असाइन किया जा रहा मान स्वयं फ़ंक्शन नहीं है, बल्कि फ़ंक्शन के परिणाम को लागू किया जा रहा है।" लेकिन मुझे लगता है कि यह स्पष्ट नहीं था।
दथन

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