बेनामी फ़ंक्शन बनाम अलग-अलग नामित फ़ंक्शन को जंक्शन में आरंभीकरण के लिए


9

मान लीजिए कि हमारे पास कुछ कोड हैं जिनका उपयोग किसी पृष्ठ के लोड होने पर चीजों को इनिशियलाइज़ करने के लिए किया जाता है और यह इस तरह दिखता है:

function initStuff() { ...}
...
$(document).ready(initStuff);

InitStuff फ़ंक्शन केवल स्निपेट की तीसरी पंक्ति से कहा जाता है। फिर कभी नहीं। इसलिए आमतौर पर लोग इसे इस तरह से गुमनाम कॉलबैक में डालते हैं:

$(document).ready(function() { 
    //Body of initStuff
});

कोड में एक समर्पित स्थान में फ़ंक्शन होने से वास्तव में पठनीयता में मदद नहीं मिल रही है, क्योंकि तैयार पर कॉल के साथ () यह स्पष्ट करता है कि यह इनिशियलाइज़ेशन कोड है।

क्या एक के बाद एक पसंद करने के लिए कोई अन्य कारण हैं?


4
पहले एक वैश्विक नामस्थान का सुराग लगाता है। दूसरा चुनें।
रिवल

जवाबों:


10

जैसा कि @ Stargazer712 ने उल्लेख किया है, पहला नाम वैश्विक नामस्थान का है, इसलिए दूसरा विजेता IMHO है। अब, कहा जा रहा है कि, क्योंकि आप दूसरे उदाहरण में एक अनाम फ़ंक्शन का उपयोग कर रहे हैं, तो आपके डीबगर का कॉलबैक बेकार हो जाएगा और आपके द्वारा उपयोग किए जाने वाले डीबगर के आधार पर अलग-अलग परिणाम प्राप्त होंगे। स्वाभाविक रूप से, मैं अंत में क्या कर रहा हूं:

$(document).ready(function MODULE_init() { 
    //Body of initStuff
});

इस तरह, वैश्विक नाम स्थान अव्यवस्थित नहीं होता है और आपके पास एक उपयोगी कॉलस्टैक है।

मैं सभी अनाम (अच्छी तरह से, अब अनाम नहीं;) फ़ंक्शन परिभाषाओं में उपरोक्त सम्मेलन का उपयोग करता हूं। यह एक सम्मेलन है जो मुझे फ़ायरफ़ॉक्स जेएस कोड के माध्यम से ब्राउज़ करते समय मिला।

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


+1 डिबगिंग का उल्लेख करने के लिए। मैंने अक्सर Node.js कोड में "नामित कॉलबैक" (इस शब्द को वास्तव में मौजूद होने का पता नहीं है) का उपयोग देखा है, इसलिए मुझे लगता है कि यह अच्छा अभ्यास है।
ओलिवर वीलर

kangax.github.com/nfe नामांकित फ़ंक्शन अभिव्यक्तियाँ - यह लेख आपको उनके बारे में जानना चाहता है जो आप कभी भी बताते हैं।
सीन मैकमिलन

7

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

इकाई परीक्षण के संबंध में, पहला दृष्टिकोण बेहतर होगा, क्योंकि आप initstuffअलगाव में फ़ंक्शन का परीक्षण करने में सक्षम होंगे ।


आमतौर पर हमारे पास इन आरंभीकरण कार्यों में बहुत अधिक कोड नहीं होते हैं। यह कुछ स्थानों से कुछ डेटा प्राप्त कर सकता है और वह है
मार्टिन एन।

3

मैं पहले एक के लिए जाऊंगा, पठनीयता / डिबगिंग / परीक्षण आदि के लिए, आप अपने पृष्ठ पर सभी कार्यों के लिए एक स्थानीय नाम स्थान बनाकर वैश्विक नाम स्थान अव्यवस्था के मुद्दे से बच सकते हैं। मैं ऑब्जेक्ट नोटेशन शैली का उपयोग करता हूं, जैसा कि पॉल आयरिश द्वारा सिफारिश की गई है ( http://paulirish.com/2009/perf/ पर स्लाइड 13-15 देखें )

var MYPAGE = {
  onReady : function(){
  // init code
  },
  someOtherCallback : function(){}
};

jQuery(document).ready(MYPAGE.onReady);

2

वैश्विक नामस्थान को अव्यवस्थित किए बिना इनिट विधियों को पंजीकृत करने का तीसरा तरीका भी है जो मुझे पसंद है:

jQuery(function(){....});

यह छोटा है और डोम दस्तावेज़ देखने से बचता है जैसे

jQuery(document).ready(function(){...}); 

कर देता है।


+1: मुझे लगता है कि यह मानक अभ्यास है, लेकिन $मैं पसंद की परस्पर विरोधी परिभाषाओं के साथ किसी भी समस्या से बचने के लिए :jQuery(function($) {...});
kevin cline
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.