2012-07-16 13 views
8

मैंने SO पर अन्य सभी (उत्कृष्ट) उत्तरों को देखा है (विशेष रूप से यह: How do JavaScript closures work?) लेकिन मैं अवधारणा की मेरी समझ पर आपकी प्रतिक्रिया चाहता था।क्या यह जावास्क्रिप्ट बंद करने के लिए एक वैध उपयोग केस है?

मैं समझता हूं कि सार्वजनिक उपयोग से निजी तरीकों के कार्यान्वयन को छिपाने के लिए एक उपयोग का मामला है।

<script> 

function carFactory(make) { 

    var m = make; 
    return { manufacture: function (model) 

     {console.log("A " + m + " " + model + " has been created");} 

    } 
} 

toyotaFactory = carFactory("toyota"); 
hondaFactory = carFactory("honda"); 

toyotaFactory.manufacture("corolla"); 
toyotaFactory.manufacture("corolla"); 
hondaFactory.manufacture("civic"); 

</script> 

यह आउटपुट:

अन्य एक है कि मैं के बारे में सोच एक कारखाने जनरेटर के रूप में यह चल रहा है

A toyota corolla has been create 
A toyota corolla has been created 
A honda civic has been created 

तो तुम बंद के लिए अपने एक वैध उपयोग के मामले में सोचते हैं (यानी बनाने एक ही कोड बेस का उपयोग कर कई कारखानों)? या क्या मैं कुछ बेहतर तरीके से एक ही चीज़ प्राप्त कर सकता हूं?

कृपया ध्यान दें कि प्रश्न बंद करने के तकनीकी कार्यान्वयन और आवेदन डिजाइन/विकास में वैध उपयोग मामलों के बारे में अधिक जानकारी है।

धन्यवाद।

+0

मुझे ठीक लगता है। – Almo

+0

अच्छा लग रहा है! मैने इसके साथ कुछ भी गलत नहीं देखा। – Linuxios

+3

तकनीकी रूप से, आपको 'एम' की आवश्यकता नहीं है - आप केवल' मेक 'का उपयोग कर सकते हैं। – josh3736

उत्तर

3

हां, चर को निजी रखने के लिए एक बंद करने के लिए वैध उपयोग है। यह आपको एक सार्वजनिक सदस्य बनाये बिना चर के लिए निजी पहुंच प्राप्त करने की अनुमति देता है। http://www.crockford.com/javascript/private.html

0

क्लोजर अत्यंत शक्तिशाली निर्माण कर रहे हैं, उपयोगी का उपयोग करता है की एक बहुत कुछ के साथ:

अन्य उदाहरण के लिए इस संदर्भ देखें। जिस पर आपने उपयोग किया वह वास्तव में एक "हैक" है। बंद करने के लिए सबसे आम उपयोग, तब होता है जब आपने कुछ कार्यक्षमता लागू की है जो मध्य में "कुछ करता है" ... और वह "कुछ करता है" जिसे आप चाहते हैं कम या ज्यादा कॉन्फ़िगर किया जा सकता है ... उदाहरण के लिए jQuery AJAX कार्यक्षमता जब अनुरोध में कोई त्रुटि हो, या जब यह सफल हो, तो "कुछ करें" ... यदि आपके पास बंद नहीं हुआ है, तो आप केवल "स्थैतिक रूप से परिभाषित" फ़ंक्शन को पारित करने में सक्षम होंगे, जिसे शायद इसकी आवश्यकता होगी वैश्विक चर से जो कुछ भी करना चाहते हैं, उसे करने के लिए आवश्यक संदर्भ इकट्ठा करें, या आपको सी या सी ++ जैसे फ़ंक्शन (कस्टमडाटा) {} ... क्लोजर अनुमति देता है जैसे सभी कार्यों के लिए समान हस्ताक्षर का उपयोग करना होगा आप रनटाइम पर "गतिशील रूप से फ़ंक्शन का निर्माण" करने के लिए, उनके द्वारा बनाए गए संदर्भ को फिर से लिखने के लिए, ताकि आप उन मॉड्यूल को पास कर सकें जिन्हें वास्तव में आसान तरीके से "कुछ भी" करने की आवश्यकता है (वास्तव में क्या है आप सी या सी ++ या क्लोजू के बिना करेंगे res, कि यह बदसूरत, त्रुटि प्रवण, और एक हैक भी है)।

तो जब भी आप "कॉन्फ़िगर" चाहिए कुछ अंदर कुछ कस्टम कार्यक्षमता, आप एक बंद का उपयोग करेंगे ...

1

मैं सही ढंग से अपने प्रश्न समझ रहा हूँ, तो आप make संपत्ति निजी रखने के साथ संबंध नहीं कर रहे हैं ? अगर ऐसी बात है, तो एक बंद वास्तव में आवश्यक नहीं है, और आप एक प्रोटोटाइप का उपयोग कर ही कार्यक्षमता को प्राप्त कर सकता है ...

function carFactory(model){ 
    this.m = make; 
} 

carFactory.prototype.manufacture = function(model){ 
    console.log('A ' + this.m + ' ' + model + ' has been created'); 
} 

कौन सा प्रदर्शन लाभ (कम स्मृति और वृद्धि की गति) संबंधित किया जाता है प्रति this question के रूप में, ।

+1

यह मॉडल नाम स्टोर करता है, लेकिन इसे निजी नहीं रखता है। सदस्य चर किसी के लिए उपलब्ध हैं।ओपी के बंद होने का लाभ यह है कि मॉडल का नाम वास्तव में निजी है। – jfriend00

+0

हाँ, मेरे उत्तर को थोड़ा और विशिष्ट होने के लिए संपादित किया। यह 'केवल' निजी रखना अनावश्यक है, यह केवल एक व्यावहारिक उत्तर है। यदि यह है, तो, एक बंद सबसे अच्छा समाधान है। – market

+1

मैंने सोचा कि ओपी के प्रश्न में बंद होने का पूरा बिंदु गोपनीयता था। मैं इस बात से सहमत हूं कि अगर गोपनीयता की आवश्यकता नहीं है, तो बंद होने की आवश्यकता से अधिक जटिल (और शायद खराब स्मृति खपत) बंद है। यदि सार्वजनिक है, तो एक सदस्य चर सबसे सरल है। – jfriend00

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