2012-10-02 9 views
28

संभव डुप्लिकेट:
How do JavaScript closures work?इस तरह से अज्ञात कार्यों के लिए तर्क पारित करने का उद्देश्य क्या है?

मैं Google Closure Compiler के साथ चारों ओर खेल रहा था, यादृच्छिक कोड में डाल यह क्या करेंगे देखने के लिए।

यह मेरी कार्यों में से एक दुबारा लिखा कुछ इस तरह देखने के लिए:

(function(msg) { console.log(msg); })("Hello World!");​​​​​​​ 

यह प्रतीत होता है कि कहाँ "Hello World" तर्क अज्ञात फ़ंक्शन यह पूर्ववर्ती करने के लिए msg के रूप में पारित है। मैं एक पल के लिए इसे देख रहा था, और सोचा था कि मैं jQuery प्लगइन्स में कुछ इसी तरह है कि कुछ इस तरह दिखाई देखा था:

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

कौन सा अब मेरे लिए और अधिक समझ में आता है, $ के साथ संघर्ष के दायरे में। लेकिन इस तरह के किसी अज्ञात फ़ंक्शन में तर्क पारित करने का प्राथमिक कारण या उद्देश्य क्या है? फ़ंक्शन के भीतर वे चर के रूप में तर्कों को परिभाषित क्यों नहीं करेंगे? क्या इस तरह के कार्यों को लिखने के लिए कोई प्रदर्शन या लचीलापन लाभ है?

+0

कि विशिष्ट कोड के लिए, वहाँ कोई वास्तविक कारण नहीं है। आप बस 'console.log ("हैलो") कर सकते हैं; '। लेकिन आम तौर पर यह कुछ स्थानीय चर बनाने के लिए होता है जो केवल कुछ कार्यों के लिए सुलभ होते हैं जो अंदर और निर्यात किए जाते हैं। –

+0

मैं आपके मूल कोड को देखने के लिए उत्सुक हूं जिसके परिणामस्वरूप वह फॉर्म होगा। यदि आपके पास ADVANCED_OPTIMIZATIONS सक्षम है, तो मैं शर्त लगाऊंगा, यह पूरी तरह से फ़ंक्शन से छुटकारा पायेगा। –

+0

@ user1689607 फ़ंक्शन थोड़ा अलग और लंबा तरीका था।मैंने इसे SO पर साफ करने के लिए संक्षिप्त किया। इस विशिष्ट उदाहरण –

उत्तर

10

दायरे के लिए भी एक महत्वपूर्ण अंतर जुड़ा हुआ है। निम्नलिखित कोड: यह अब की जरूरत है के बाद क्योंकि दूसरा कोड चर छोड़ देता है

var msg = "Hello World!"; 
console.log(msg); 

, लेकिन अन्य भागों के साथ हस्तक्षेप कर सकते हैं:

(function(msg) { console.log(msg); })("Hello World!");​​​​​​​ 

इस से नाम स्थान प्रदूषण के मामले में कुछ परिस्थितियों क्लीनर में है कोड का

यह विशेष रूप से महत्वपूर्ण है जब आप किसी अन्य फ़ंक्शन के बाहर उल्लिखित कोड निष्पादित करते हैं: ऐसे मामले में msg चर वैश्विक चर के रूप में पृष्ठ पर हर जगह उपलब्ध होगा।

+0

लेकिन यह एक अलग फ़ंक्शन में अपना दूसरा उदाहरण लपेटने के बाद अलग कैसे होगा? चर अभी भी अंत –

+0

में ही मर जाएंगे मैं छाप वह अधिक कुछ इस तरह का मतलब थोड़ा कम था: http://jsfiddle.net/cv5Jp/ –

+0

@KevinB ठीक है, क्या आपके बेला और समारोह मैं पोस्ट के बीच का अंतर है? –

0

असल में, अपने कोड को अन्य लोगों के साथ टकराने से रोकने के लिए अपने कोड को लपेटने के लिए हमेशा एक अच्छा विचार है: (function(){/*code*/}());

मुझे लगता है कि मुख्य चीज़ बंद करने वाला कंपाइलर 5 वर्णों को सहेज रहा है: var  और =

0

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

console.log("Hello World!"); 
संबंधित मुद्दे

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