2012-02-09 15 views
5

संपादितजावास्क्रिप्ट बंद - क्या कह प्रतिक्रियाओं की संख्या के साथ इन

बीच का अंतर है "आप निजी बातें कर सकते हैं!" नीचे, मैं इसे शीर्ष पर भी जोड़ने जा रहा हूं:

मुझे पता है कि आप बंद होने के भीतर निजी चर का अनुकरण कर सकते हैं। यही वह नहीं है जो मैं पूछ रहा हूं। मैं पूछ रहा हूं, नीचे दिए गए दो उदाहरण दिए गए हैं जहां मैं बंद होने से सब कुछ "निर्यात" कर रहा हूं, इन दो उदाहरणों के बीच मौलिक अंतर क्या है।

वस्तुओं/तरीकों बनाने के इन दोनों तरीकों को देखते हुए:

var test = {} 

test = (function(){ 
    var a_method = function(print_me){ 
     return "hello "+print_me; 
    } 

    return {print_me: a_method}; 
})(); 

test.print_me2 = function(print_me2){ 
    return "hello "+print_me2; 
} 

test.print_me('world'); 
>>> returns "hello world" 

test.print_me2('world'); 
>>> returns "hello world" 

मैं समझता हूँ कि पहली विधि निजी चर के लिए अनुमति देता है (जो दिल में एक अजगर डेवलपर मैं सच में उपयोग करने के लिए परवाह नहीं है के रूप में), लेकिन दोनों मेरे लिए समान समतुल्य प्रतीत होते हैं, केवल पहला "कूलर" दिखता है (जैसा कि सभी बड़े जावास्क्रिप्ट में लोग ऐसा करते हैं) और दूसरी तरफ बहुत पास लग रहा है;

तो, जैसा अंतर है?

मैंने यहां क्लोजर प्रश्नों को देखा है - उनमें से अधिकतर आप किस चीज का उपयोग करते हैं या क्यों उपयोग करते हैं; मैं उनकी उपयोगिता को समझता हूं, मैं सिर्फ यह जानना चाहता हूं कि आप दूसरे से पहले क्यों करेंगे और इसके क्या फायदे हैं।

मैं अनुमान पर सख्त सबूत पसंद करूंगा - "यह अच्छा नहीं है कि" शांत बच्चे इसे कैसे कर रहे हैं "या" मैंने सुना है कि जब आप बंद करने का उपयोग करते हैं तो मोज़िला बेहतर स्मृति उपयोग करता है ", बल्कि गुणात्मक सबूत दूसरे की तुलना में 'बेहतर' होने की ओर।

उत्तर

3

विधियों के बीच का अंतर अज्ञात फ़ंक्शन रैपर है जो बंद करता है, लेकिन यह भी कि पहली विधि पूरे ऑब्जेक्ट को प्रतिस्थापित करती है जबकि दूसरी विधि मौजूदा विधि में केवल एक प्रॉपर्टी सेट करती है।

किसी ऑब्जेक्ट में विधियों को जोड़ने के विभिन्न तरीके हैं। आप उन्हें वहाँ रख सकते हैं जब आप वस्तु बनाने:

var test = { 
    print_me: function(text) { return "hello " + text; } 
}; 

आप किसी मौजूदा ऑब्जेक्ट के लिए एक संपत्ति के रूप में एक विधि जोड़ सकते हैं:

var test = {}; 
test.print_me = function(text) { return "hello " + text; }; 

आप एक निर्माता समारोह कर सकते हैं और करने के लिए तरीके जोड़ अपने प्रोटोटाइप:

function Test() {} 
Test.prototype.print_me = function(text) { return "hello " + text; }; 
var test = new Test(); 

जावास्क्रिप्ट एक प्रोटोटाइप आधारित ऑब्जेक्ट मॉडल है के रूप में, पिछले एक कैसे तरीकों से बनाया जा करने का इरादा किया गया है। अन्य तरीकों से बस संभव है क्योंकि किसी ऑब्जेक्ट प्रॉपर्टी में फ़ंक्शन के रूप में कार्य हो सकता है।


आप किसी भी कोड जहां स्थानीय चर चाहते चारों ओर एक समारोह आवरण का उपयोग कर सकते हैं, ताकि आप संपत्ति स्थापित करने का दूसरा तरीका के साथ ऐसा कर सकते हैं:

test.print_me2 = (function(){ 

    var method = function(print_me2) { 
    return "hello "+print_me2; 
    } 

    return method; 
})(); 
+0

जो पहले से कहीं अधिक बेहतर उत्तर है। और हाँ, मैं समझता हूं कि ऑब्जेक्ट को ऑब्जेक्ट की प्रॉपर्टी सेट करने के बजाए तुरंत निष्पादित फ़ंक्शन का परिणाम होने के लिए सेट कर रहा हूं - मान लीजिए कि मैं सिर्फ 'print_me' बनाने की कोशिश कर रहा हूं जो कि एकमात्र संपत्ति होगी परीक्षण वस्तु। सीधे कार्य के रूप में इसे बंद करने के बजाय इसे बंद करने का क्या फायदा होगा? – tkone

+0

@ टकोन: इसे बंद करने में इसका लाभ यह है कि आपके पास बंद है। आप स्थानीय चर बना सकते हैं, ताकि आप वैश्विक नामस्थान को प्रदूषित न करें। हालांकि, यदि आप लाइब्रेरी कोड या प्लगइन लिख रहे हैं तो वैश्विक नामस्थान से सावधान रहना एक मुद्दा है। उदाहरण के लिए बड़ी लाइब्रेरी jQuery केवल वैश्विक नामस्थान में दो नाम जोड़ती है। – Guffa

+0

ठीक है शांत। यही वही है जो मैं समझने की कोशिश कर रहा था। मुझे पता है कि वैश्विक नामस्थान में नामों का एक टन जोड़ना एक बुरा विचार है (इसलिए नेमस्पेसिंग का उपयोग करना), लेकिन सिर्फ यह जानना चाहता था कि लोग बंद कर रहे हैं क्योंकि वे "गर्म" हैं या अगर उन्होंने उपरोक्त मामले में उपयोगिता की सेवा की है। – tkone

2

पहले उदाहरण में, स्थानीय चर को वैश्विक चर से बाहर रखने के लिए बंद करने के लिए उपयोग किया जाता है।

var thisIsGlobal = 2; 
var test = (function() { 
    var thisIsLocal = 3; 
    return function() { 
    return thisIsLocal; 
    }; 
}()); 

क्या आप प्राप्त एक समारोह test जो जब रिटर्न स्थानीय चर thisIsLocal का मूल्य लागू है। चर के मान को बदलने का कोई तरीका नहीं है। आप इसे एक निजी चर के रूप में देख सकते हैं।

+1

मैं वास्तव में इच्छा जावास्क्रिप्ट निजी बातें निजी बनाने के लिए एक बेहतर तरीका था ... –

+1

"कोई रास्ता नहीं" पूरी तरह से सही नहीं है। कुछ (old'ish) जेएस इंजन कार्यों के '.__ parent__' विशेषता का उपयोग करने की अनुमति देते हैं, जो वास्तव में एक बंद माता-पिता के दायरे तक पहुंचने की अनुमति देगा। – jAndy

+0

@ जनकुका मैं यहां स्कॉइंग मुद्दों को समझता हूं - जो मैं पूछ रहा हूं उसके पास निजी/सार्वजनिक या उसके अनुकरण के साथ कुछ लेना देना नहीं है, बल्कि दो उदाहरणों के बीच अंतर - एक बंद करने में बंद होने और एक बंद होने के बाहर एक । – tkone

0

पहली विधि आप वर्तमान (एक अज्ञात फ़ंक्शन जिसे तुरंत निष्पादित किया जाता है) आपके प्रोग्राम को वैश्विक दायरे से बाहर रखता है। कि निजी दायरे के भीतर आप तय कर सकते हैं गुण आप अपने एपीआई के रूप में बेनकाब करने के लिए करना चाहते हैं:

(function(win){ 
    var a, b, c = 1; 

    function init(){ 
    return aa(b); 
    } 

    function exit(){ 
    if(cc()){ 
     return a; 
    } 
    } 

    function aa(){ 
    } 

    function bb(){ 
    } 

    function cc(){ 
    } 

    win.myProgram = {init: init, 
        exit: exit }; 
})(window); 


// We now have access to your API from within the global namespace:  
myProgram.init();  
//etc 
संबंधित मुद्दे