अनाम फ़ंक्शन को क्यों परिभाषित करें और तर्क के रूप में इसे jQuery पास करें?


98

मैं backbone.js स्क्रूनास्ट से उत्कृष्ट peepcode डेमो कोड के माध्यम से देख रहा हूँ। इसमें, बैकबोन कोड सभी एक अनाम फ़ंक्शन में संलग्न है जिसे jQuery ऑब्जेक्ट पास किया गया है:

(function($) {
  // Backbone code in here
})(jQuery);

अपने स्वयं के बैकबोन कोड में, मैंने अपने सभी कोड को jQuery DOM 'रेडी' इवेंट में लपेटा है:

$(function(){
  // Backbone code in here
});

पहले दृष्टिकोण के बिंदु / लाभ क्या है? इसे इस तरह से करने से एक अनाम फ़ंक्शन बनता है, जिसे तुरंत jQuery ऑब्जेक्ट के साथ फ़ंक्शन तर्क के रूप में पारित किया जाता है, प्रभावी रूप से यह सुनिश्चित करता है कि $ jQuery ऑब्जेक्ट है। क्या यह एकमात्र बिंदु है - यह गारंटी देने के लिए कि jQuery '$' के लिए बाध्य है या ऐसा करने के लिए अन्य कारण हैं?


4
आपको इसके बजाय पहले SO को ब्राउज़ करना चाहिए था।
अलेक्जेंडर

अन्य पुस्तकालयों के साथ अंतर - यदि पृष्ठ लेखक को उपयोग करने की आवश्यकता है $.noConflict(), तो पहला उदाहरण अभी भी काम करेगा।
डीसीओडर

संभव डुप्लिकेट: jQuery और $ प्रश्न
अलेक्जेंडर

संभव डुप्लिकेट देखें jQuery document.ready बनाम स्वयं गुमनाम समारोह बुला अंतर के लिए
Bergi

@Alexander लेकिन फिर अन्य लोगों को पहले SO पर यह प्रश्न मिलेगा। :-)
caiosm1005

जवाबों:


182

आपके द्वारा दिखाए गए कोड के दो ब्लॉक नाटकीय रूप से भिन्न होते हैं कि वे कब और क्यों निष्पादित करते हैं। वे एक दूसरे के अनन्य नहीं हैं। वे एक ही उद्देश्य की सेवा नहीं करते हैं।

जावास्क्रिप्ट मॉड्यूल


(function($) {
  // Backbone code in here
})(jQuery);

यह एक "जावास्क्रिप्ट मॉड्यूल" पैटर्न है, जिसे तुरंत लागू होने वाले फ़ंक्शन के साथ लागू किया गया है।

इस कोड का उद्देश्य आपके कोड के लिए "मॉड्यूलरिटी", गोपनीयता और इनकैप्सुलेशन प्रदान करना है।

इसे लागू करना एक फ़ंक्शन है जिसे कॉलिंग (jQuery)कोष्ठक द्वारा तुरंत लागू किया जाता है । कोष्ठक में jQuery पारित करने का उद्देश्य वैश्विक चर के लिए स्थानीय स्कोपिंग प्रदान करना है। यह $चर को देखने के ओवरहेड की मात्रा को कम करने में मदद करता है , और कुछ मामलों में minifiers के लिए बेहतर संपीड़न / अनुकूलन की अनुमति देता है।

तुरंत आह्वान कार्यों को तुरंत निष्पादित किया जाता है, ठीक है, तुरंत। जैसे ही फंक्शन की परिभाषा पूरी होती है, फंक्शन को निष्पादित किया जाता है।

jQuery का "DOMReady" फ़ंक्शन

यह jQuery के "DOMReady" फ़ंक्शन के लिए एक अन्य नाम है: http://api.jquery.com/ready/


$(function(){
  // Backbone code in here
});

jQuery का "DOMReady" फ़ंक्शन तब निष्पादित होता है जब DOM आपके जावास्क्रिप्ट कोड द्वारा हेरफेर करने के लिए तैयार होता है।

मॉड्यूल बनाम DOMReady बैकबोन कोड में

यह jQuery के DOMReady फ़ंक्शन के अंदर अपने बैकबोन कोड को परिभाषित करने के लिए खराब रूप है, और संभवतः आपके एप्लिकेशन प्रदर्शन के लिए हानिकारक है। इस फ़ंक्शन को तब तक नहीं बुलाया जाता है जब तक कि डोम ने लोड नहीं किया है और हेरफेर करने के लिए तैयार है। इसका मतलब है कि जब तक आप अपनी वस्तुओं को परिभाषित नहीं कर रहे हैं, तब तक ब्राउज़र कम से कम एक बार DOM को पार्स कर चुका होता है।

DOMReady फ़ंक्शन के बाहर अपने बैकबोन ऑब्जेक्ट को परिभाषित करना बेहतर विचार है। मैं, कई अन्य लोगों के बीच, जावास्क्रिप्ट मॉड्यूल पैटर्न के अंदर ऐसा करना पसंद करता हूं ताकि मैं अपने कोड के लिए इनकैप्सुलेशन और गोपनीयता प्रदान कर सकूं। मैं अपने मॉड्यूल से बाहर की जरूरत वाले बिट तक पहुंच प्रदान करने के लिए "रिवीलिंग मॉड्यूल" पैटर्न का उपयोग करता हूं (ऊपर पहला लिंक देखें)।

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

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

आप वेब के चारों ओर इसके बहुत सारे उदाहरण पा सकते हैं, लेकिन यहां एक बहुत ही बुनियादी कार्यान्वयन है, एक मॉड्यूल और DOMRIMY फ़ंक्शन दोनों का उपयोग करके:



// Define "MyApp" as a revealing module

MyApp = (function(Backbone, $){

  var View = Backbone.View.extend({
    // do stuff here  
  });

  return {
    init: function(){
      var view = new View();
      $("#some-div").html(view.render().el);
    }
  };

})(Backbone, jQuery);



// Run "MyApp" in DOMReady

$(function(){
  MyApp.init();
});

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

2
दिलचस्प बात यह है कि, बैकबोन src के साथ "टूडू" उदाहरण ऐप सब कुछ रेड में तैयार करता है।
मैट रॉबर्ट्स

2
जावास्क्रिप्ट मॉड्यूल पैटर्न मत भूलना भी एक कहा जाता है IIFE
जेस

1
अनाम फ़ंक्शन अनिवार्य रूप से DOM तैयार होने पर उसी समय निष्पादित किए जाते हैं ताकि यह उन्हें और अधिक कुशल कैसे बना सके ??
bhavya_w 14

14

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


9

यह सुनिश्चित करता है कि आप हमेशा$ उस बंद के अंदर उपयोग कर सकते हैं, भले ही $.noConflict()वह इस्तेमाल किया गया हो।

इस बंद के बिना आपको पूरे समय के jQueryबजाय उपयोग करना चाहिए $


4

यह $ चर के संभावित संघर्ष से बचने के लिए है। यदि कुछ और $ नाम के एक चर को परिभाषित करता है, तो आपका प्लगइन गलत परिभाषा का उपयोग कर सकता है

अधिक विवरण के लिए http://docs.jquery.com/Plugins/Authoring#Getting_Started देखें


2

दोनों का उपयोग करें।

पुस्तकालय में होने वाले झगड़ों को रोकने के लिए आप स्वयं jQuery में कार्य करते हैं, और केवल सुनिश्चित करें कि jQuery उपलब्ध है जैसा कि आप $ के साथ उम्मीद करेंगे।

और पहले से ही () शॉर्टकट विधि के रूप में जावास्क्रिप्ट चलाने के लिए आवश्यक है के बाद ही डोम लोड किया गया है:

(function($) {
    $(function(){
          //add code here that needs to wait for page to be loaded
    });

    //and rest of code here
})(jQuery);

एक छोटा संस्करण जो मुझे SO पर कहीं नहीं मिला (अपरिभाषित सुरक्षा भी करता है) :jQuery(function ($, undefined) { /* Code */ });
Jared Gotte
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.