2010-01-08 11 views
18

इसका क्या अर्थ है?jquery बंद करने पर एक साधारण सवाल

(function($){ 
})(jQuery); 

सवाल स्पष्ट करने के, क्या करता लपेटकर कोष्टक में एक समारोह के जे एस में मतलब (क्षमा करें, मैं थोड़ा बंद की अवधारणा पर उलझन में हूँ)। $ पैरामीटर के बारे में क्या? और अंत में ब्रांड्स में "jQuery"?

क्या मैं mootools के साथ ऐसा ही कर सकता हूं और उन्हें 1 जेएस फ़ाइल में जोड़ सकता हूं?

(function($){})(jQuery); 

(function($){})(mooTools); 

मैं केवल jQuery के साथ काम किया है और एक समारोह अभिव्यक्ति के रूप में मूल्यांकन किया जाना Mootools

+0

[जावास्क्रिप्ट/jQuery बंद समारोह वाक्य रचना] (http के संभावित डुप्लिकेट: // stackoverflow।कॉम/प्रश्न/4472528/जावास्क्रिप्ट-jquery-closure-function-syntax) – Matt

उत्तर

24

कोष्ठक के बीच एक समारोह रैपिंग के साथ काम करने सुनिश्चित करता है इस समारोह योजना बना रहा हूँ।

ऐसा इसलिए होता है क्योंकि Grouping Operator (कोष्ठक), केवल अभिव्यक्तियों का मूल्यांकन कर सकते हैं

कोई कोष्ठक उपयोग किया जाता है, तो यह एक समारोह घोषणा के रूप में, के बाद से समारोह नाम नहीं समारोह घोषणाओं के लिए वैकल्पिक है व्याख्या की जाएगी, और यह एक सिंटैक्स त्रुटि का कारण होगा।

(function(arg){ 
    alert(arg); // alerts test 
})("test"); 

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

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

ध्यान रखें कि फ़ंक्शन संदर्भ (this कीवर्ड) उपरोक्त उदाहरण की तरह स्वयं-निष्पादन फ़ंक्शन एक्सप्रेशन के अंदर आते हैं, हमेशा वैश्विक ऑब्जेक्ट को संदर्भित करेंगे।

समारोह भाव और समारोह घोषणाओं के बीच मतभेद के बारे में अधिक गहराई से जानकारी के लिए, निम्न संसाधनों को एक नज़र दे:

+0

@ सीएमएस इस के लिए सही शब्द क्या है? मैं इसे "स्वयं निष्पादित अज्ञात कार्य" कह रहा हूं क्या मेरा शब्द भी सटीक है? एक महान जवाब के लिए +1! –

+1

@Doug: हाँ, मुझे लगता है कि आपका शब्द सटीक है, लेकिन याद रखें कि फ़ंक्शन एक्सप्रेशन का नाम भी हो सकता है, यह केवल वैकल्पिक है (कॉल स्टैक की जांच के लिए वास्तव में डीबगिंग के लिए उपयोगी है, हालांकि जेस्क्रिप्ट में बहुत गंभीर बग हैं http://groups.google.com/group/comp.lang.javascript/msg/5b508b03b004bce8 और रिकर्सन के लिए भी उपयोगी है (चूंकि ES5 सख्त मोड में 'arguments.callee' अनुपलब्ध होगा)), इसलिए * "स्वयं निष्पादन फ़ंक्शन अभिव्यक्ति" * थोड़ा और सटीक हो सकता है ... – CMS

+0

@CMS - बहुत बढ़िया, धन्यवाद! –

0

function($) { ... } एक समारोह बनाता है जो $ नामक पैरामीटर स्वीकार करता है।

ब्रांड्स में लपेटना कुछ भी नहीं करता है।

(jQuery) जोड़ना पैरामीटर के रूप में jQuery के साथ फ़ंक्शन को कॉल करता है।


यह वैश्विक दायरे में $ के समारोह स्वतंत्र बनाने के लिए किया जाता है।
जब आप फ़ंक्शन में $ लिखते हैं, तो आप पैरामीटर$ का संदर्भ दे रहे हैं, न कि वैश्विक चर $। , के रूप में सीएमएस ने कहा है, यह एक समारोह अभिव्यक्ति है http://www.jibbering.com/faq/faq_notes/closures.html

असल:

+6

यह भी ध्यान रखें कि यद्यपि ब्रांड्स में एक फ़ंक्शन को लपेटना "कुछ भी नहीं करता", यदि आप फ़ंक्शन के बाद (jQuery) जोड़ना चाहते हैं तो यह आवश्यक है। –

1

यहाँ बंद पर एक लेख है। उस पृष्ठ के नीचे 2/3 के बारे में बेहतर ढंग से समझने में आपकी सहायता करने के लिए एक आदर्श उदाहरण है।

jQuery कोष्ठक के अंतिम सेट में मतलब है कि आप jQuery ऑब्जेक्ट को आंतरिक फ़ंक्शन पर पास कर रहे हैं। वह आंतरिक कार्य वस्तु लेता है और इसे $ के रूप में असाइन किया गया है। इसलिए, जब आप फ़ंक्शन के अंदर $ तक पहुंच रहे हैं, तो आप वास्तव में आपके द्वारा पारित jQuery ऑब्जेक्ट पर कार्य कर रहे हैं।

इन्हें jQuery और Mootools के साथ मिश्रित करने के लिए, मैंने कभी Mootools का उपयोग नहीं किया है, इसलिए मुझे यकीन नहीं है कि यह स्वयं को कैसे निर्दिष्ट करता है। एकमात्र चीज जो मुझे लगता है वह यह है कि यदि यह $ jQuery की तरह उपयोग करता है, तो आप jQuery.noConflict(); पर कॉल कर सकते हैं और jQuery को किसी अन्य चर पर फिर से सौंप सकते हैं, शायद var $j = jQuery; फिर, आप सामान्य रूप से मूटूल का उपयोग कर सकते हैं।

6

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

var x = (1+1); // <--() evaluates an expression 

और:

var arr = [0,1,2]; 
arr.push(function(text){alert(text)}); 
arr[3]('hello'); // <-- function returned by array called directly 

और $ पैरामीटर के लिए के रूप में, कि अक्षर है कि जावास्क्रिप्ट चर नाम के लिए अनुमति देता है में से एक है। $ नेमस्पेसिंग के लिए बराबर

(function(jQ){})(jQuery); 
(function(moo){})(mooTools); 
0

mootools है:: आपका उदाहरण के लिए बिल्कुल बराबर है

(function($) { 
    // $ is the mootools one (aliasing document.id) 
})(document.id); 

आप उन्हें एक फ़ाइल में गठजोड़ कर सकते हैं, लेकिन ध्यान रखें कि mootools एक प्रोटोटाइप ढांचा है और $ केवल एक चयनकर्ता के उद्देश्य की सेवा करता है जबकि सभी कार्य तत्व/सरणी/कक्षा आदि प्रोटोटाइप में जाते हैं। इसलिए mootools में यह कर काम करता है:

var foo = $("bar"); 
foo.hide(); // the element inherits .hide() 

लेकिन jQuery में यह असफल हो जायेगी और लिखित किए जाने की बात है के रूप में

var foo = $("#bar"); 
$(foo).hide(); 

की जरूरत है, आप सामान नाम स्थान नहीं दे सकते कि प्रोटोटाइप में mootools निर्यात।

5

ऐसा करने का मुख्य बिंदु यह है कि फ़ंक्शन की अभिव्यक्ति के भीतर बनाई गई वस्तुओं का उपयोग उन वस्तुओं को सार्वजनिक रूप से उजागर किए बिना वस्तुओं में पारित गुणों और विधियों से किया जा सकता है। यह परिवर्तनीय टकराव को रोकने में सहायता कर सकता है। यह भी कुछ भी है कि जुड़ा हुआ है के लिए निजी भंडारण के रूप में पहुँचा जा करने के लिए बनाया चर के लिए अनुमति देता है ..

(function($){ 
//jQuery is available here as $
var myPrivateArray = []; //this is private
$.addItem = function(item) { myPrivateArray.push(item); }
})(jQuery);

//I can't access myPrivateArray here... //but I can use jQuery.addItem to add something.

संबंधित मुद्दे