2013-05-03 5 views
9

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

var Module = (function() { 
    var privateVariable = "foo", 
     privateMethod = function() { 
      alert('private method'); 
     }; 

    return { 
     PublicMethod: function() { 
      alert(privateVariable); 
      privateMethod(); 
     } 
    }; 
})(); 
+0

क्या असाइन किया गया है आप आवश्यक समझ का 50% देना चाहिए चारों ओर अपने मन हो रही है। अन्य 50% [बंद] (https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Closures) की समझ से आता है। यदि आपको अभी भी परेशानी है तो डगलस क्रॉकफोर्ड के "[जावास्क्रिप्ट में निजी सदस्य] (http://javascript.crockford.com/private.html) पढ़ें"। –

उत्तर

9

कैसे एक स्वयं को क्रियान्वित समारोह निजी चर छिपा कर सकते हैं और केवल लौटे वस्तु का पर्दाफाश। यह सामान्य जावास्क्रिप्ट फ़ंक्शन के साथ क्यों नहीं होता है?

यह सामान्य जावास्क्रिप्ट कार्यों के साथ होता है।

function MakeModule() { 
    var privateVariable = "foo", 
     privateMethod = function() { 
      alert('private method'); 
     }; 

    return { 
     PublicMethod: function() { 
      alert(privateVariable); 
      privateMethod(); 
     } 
    }; 
} 

var Module = MakeModule(); 

ठीक काम करेगा।

एकमात्र अंतर यह है कि अनाम कार्य एक कम वैश्विक चर प्रस्तुत करता है और खुद को कचरा होने की अनुमति देता है जबकि MakeModule लेखक द्वारा स्पष्ट रूप से delete डी तक एकत्र नहीं किया जा सकता है।

+0

क्या आईआईएफई वास्तव में जीसी'd हो सकता है अगर उसने एक बंदरगाह बनाया हो जिसमें ऐसी चीजें शामिल हों जो इसके द्वारा लौट आए थे? –

+1

@DaggNabbit, हाँ। जब तक इसकी 'तर्क' वस्तु का उपयोग नहीं किया जाता है। फ़ंक्शन ऑब्जेक्ट को कॉल के लिए एक ऑपरेंड के रूप में बनाया गया है, जैसे ही कॉल पूर्ण हो जाता है, इसके प्रारंभिक संदर्भ का अब उपयोग नहीं किया जाता है और कॉल से केवल एक ही चीज़ छोड़ी जाती है जो निष्पादन संदर्भ है जो आंतरिक कार्यों से बचकर स्टोर चर को बंद कर देता है । –

2

निजीकरण बंद होने की वजह से है। "Var PrivateVariable" को "PublicMethod" द्वारा बंद कर दिया गया है, इसलिए केवल वह फ़ंक्शन वेरिएबल तक पहुंच सकता है क्योंकि केवल इसे बंद करने में ही है। इसे किसी और चीज से संदर्भित नहीं किया जा सकता है और "निजी"

यह न केवल "तुरंत-आमंत्रित फ़ंक्शन अभिव्यक्तियों" में होता है बल्कि सामान्य फ़ंक्शन कॉल में भी होता है। जब आप बाहरी फ़ंक्शन को कॉल करते हैं तो इसे बाद में करने के बजाय मॉड्यूल को परिभाषित करते समय तुरंत बंद करने का एक तरीका है। http://javascript.crockford.com/private.html

+0

"तुरंत बंद करने का विचार" का विचार मेरे प्रश्न का सबसे अच्छा जवाब देता है। – Brendan

0

आप नामित समारोह के माध्यम से एक गुमनाम समारोह को परिभाषित कर सकते हैं:

इसके अलावा डगलस Crockford खुद से इस पोस्ट में देखते हैं।

उदाहरण:

//factorial 
(function(n){ 
    var self = function(n){ 
     //call self 
     return n > 0 ? (self(n-1) * n) : 1; 
    } 
    return self; 
})() 
संबंधित मुद्दे

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