2013-07-22 18 views
7

मान लीजिए कि मैं नाम स्थान करते हैं,फ़ंक्शन ए से फ़ंक्शन ए को उसी नामस्थान में कैसे कॉल करें?

var Namespace = { 
    A : function() { 
     alert('Hello!'); 
    }, 
    B : function() { 
     // Call A() from here, do other stuff 
    } 
} 

इस नाम स्थान में, मैं इरादा एक बी करने के लिए एक सहायक समारोह() नाम स्थान के बाहर कभी नहीं बुलाया जाएगा कहना है कि, एक होने के लिए। इसे केवल नामस्थान के भीतर के कार्यों द्वारा बुलाया जाएगा।

किसी नामस्थान के भीतर स्थानीय/सहायक फ़ंक्शन के मुद्दे को हल करने का सबसे अच्छा तरीका क्या है? जिस तरह से मैं इसे देख वहाँ दो संभावनाएं हैं:

// Method #1  
var Namespace = { 
    A: function() { 
     alert('Method #1'); 
    }, 

    B : function() { 
     Namespace.A(); 
    } 
} 

Namespace.B(); 

// Method #2 
function Namespace2() { 
    var A = function() { 
     alert('Method #2'); 
    }; 

    this.B = function() { 
     A();   
    } 
} 

var ns2 = new Namespace2(); 
ns2.B(); 

पहली विधि में, यह बदसूरत और awkard नाम स्थान के भीतर हर समारोह में Namespace.A() (बार-बार) टाइप करने के लिए है। यह मुझे विधि # 2 पसंद करने के लिए प्रेरित करता है। लेकिन मैं उत्सुक था कि यहां सबसे अच्छा अभ्यास क्या था।

उत्तर

10

मैं एक समारोह के दायरे के अंदर "नाम स्थान" स्थापित करने की अनुशंसा:

var Namespace = { 
    B: function() { 
     var A = function() { 
      ... 
     } 

     A(); 
    } 
}; 

Namespace.B(); 
+0

यह एक अच्छा समाधान है। मेरा सवाल यह है कि, जब भी आप इसे एक्सेस करते हैं, तो नेमस्पेस अपने कार्यों को फिर से परिभाषित करता है? यदि ऐसा है, तो यह स्मृति का एक बुरा उपयोग होगा। – ktm5124

+0

@ ktm5124: नहीं। फ़ंक्शन तुरंत चलाया जाता है और ऑब्जेक्ट 'self' को' नेमस्पेस 'को असाइन किया जाता है। – Hubro

+0

@ कोडमकी आपके मामले में आप एकाधिक 'नेमस्पेस' ऑब्जेक्ट्स नहीं बना सकते हैं। – Neal

5

आप this बयान

this.A(); 
+6

इस पर अर्धविराम 'Namespace.A' कॉल करने के लिए गारंटी नहीं है। – Hubro

+0

@ हबरो अगर मैं नेमस्पेस के बजाय नेमस्पेस लिखता हूं, तो यह मेरे लिए काम करता है। – JedatKinports

1

का उपयोग कर इसे कॉल कर सकते हैं आप केवल AB अंदर उपयोग करने के लिए, क्यों B अंदर इसे परिभाषित नहीं करना चाहते हैं?

var Namespace = (function(){ 
    var A = function() { 
     alert('scoped method'); 
    }; 

    function Namespace() { 

      var A1 = function() { 
       alert('Namespace "private" method'); 
      }; 

      Namespace.prototype.B1 = function(){ 
       A(); //will run 
       A1(); //will run with no errors 
      }; 

    }; 

    Namespace.prototype.B = function(){ 
     A(); //will run 
     A1(); //ERROR! 
    }; 

    return Namespace; 
})(); 
+2

मैं वास्तव में ए अंदर बी, सी, डी, ई, का उपयोग करना चाहता हूं ... यानी, सभी सार्वजनिक नामस्थान कार्य, जो कई हैं। (मैंने उन्हें छोड़ दिया है और केवल बी शामिल है।) – ktm5124

2

वैसे आप घटना जहां नाम स्थान अपने आप दायरे में बनाई गई है एक तीसरा विकल्प का उपयोग कर सकते। सब कुछ स्पष्ट रूप से सार्वजनिक नहीं स्वाभाविक रूप से निजी होगा:

var Namespace = (function() { 
    var self = {}; 

    // Private 
    var A = function() { 
     ... 
    }; 

    // Public 
    self.B = function() { 
     A(); 
    } 

    return self; 
}()); 

Namespace.B(); // Works 
Namespace.A(); // Doesn't work 
+0

धन्यवाद नील, हालांकि मेरे पास एक ही सवाल है कि मैंने कोडमॉकी से उसकी प्रतिक्रिया में पूछा। यही है, क्या नेमस्पेस हर बार जब आप इसे एक्सेस करते हैं तो अपने कार्यों को फिर से परिभाषित करता है? – ktm5124

+0

@ ktm5124 मेरे मामले में यह नहीं है। आपको बस इतना करना है कि 'नया नेमस्पेस' सबकुछ पहले ही परिभाषित है। आप तकनीकी रूप से 'Namspace कर सकते हैं .__ proto __। बी(); 'और यह अभी भी' new' भाग के बिना चलाएगा। – Neal

-2
var Namespace = { 
    A : function() { 
     alert('Hello!'); 
    }, 
    B : function() { 
     Namespace.A(); 
    }, 
} 

टिप्पणी अंत

+0

क्या आप अपने द्वारा प्रदान किए गए समाधान के बारे में अधिक जानकारी जोड़ सकते हैं? – abarisone

+0

अंत में अल्पविराम? बी के कार्य के बाद कॉमा ('},') को कुछ भी करना है? – cpburnz

+0

क्षमा करें, मेरी अंग्रेजी अच्छी नहीं है। मैं चाहता हूं कि यह सेमी-कोलन (,) है। मुझे लगता है कि सेमी-कोलन स्नैमेस्पेस में कॉमा (;) को उत्तर देने के लिए उपयोग किया जाता है <== GOOGLE STRANSLATE। मैं अभी भी उसी तरह कोड करता हूं और यह काम कर रहा है। –

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