2013-07-22 3 views
7

Lassen Sie uns sagen, dass ich den Namespace haben,Wie Funktion A von Funktion B innerhalb desselben Namespaces aufgerufen wird?

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

In diesem Namensraum, beabsichtige ich, für A eine Hilfsfunktion nach B zu sein, das heißt, A() wird nie außerhalb des Namespace aufgerufen werden. Es wird nur von den Funktionen im Namespace aufgerufen.

Was ist der beste Weg, um das Problem einer lokalen/Hilfsfunktion in einem Namespace zu beheben? Die Art, wie ich es sehe gibt es zwei Möglichkeiten:

// 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(); 

Bei dem ersten Verfahren ist es hässlich und awkard Namespace.A() (wiederholt) in jeder Funktion innerhalb des Namens eingeben. Dies führt dazu, dass ich Methode 2 bevorzuge. Aber ich war neugierig, was hier am besten war.

Antwort

10

Ich empfehle den „Namensraum“ in dem Funktionsbereich platzieren. Alles, was nicht ausdrücklich öffentlich natürlich privat sein:

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

Dies ist eine nette Lösung. Meine Frage ist, definiert Namespace seine Funktionen jedes Mal neu, wenn Sie darauf zugreifen? Wenn dies der Fall ist, wäre es ein schlechter Speicherverbrauch. – ktm5124

+0

@ ktm5124: Nein. Die Funktion wird sofort ausgeführt und das Objekt 'self' wird dem' Namespace' zugewiesen. – Hubro

+0

@Codemonkey in Ihrem Fall können Sie nicht mehrere 'Namespace' Objekte erstellen. – Neal

5

Sie können es this Anweisung rufen

this.A(); 
+6

Dies ist nicht zu nennen 'Namespace.A' garantiert. – Hubro

+0

@Hubro, wenn ich Namespace anstelle von Namespace schreibe, funktioniert es für mich. – JedatKinports

1

Wenn Sie nur A innerhalb B verwenden wollen, warum nicht definieren es in B?

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

     A(); 
    } 
}; 

Namespace.B(); 
+2

Ich beabsichtige eigentlich, A in B, C, D, E zu verwenden, also alle öffentlichen Namespace-Funktionen, die viele sind. (Ich habe sie weggelassen und nur B eingeschlossen) – ktm5124

2

Nun können Sie Ereignis eine dritte Option verwenden, wenn die Namespace in einem eigenen Bereich erstellt wird:

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; 
})(); 
+0

Danke Neal, obwohl ich die gleiche Frage habe, die ich CodeMonkey in seiner Antwort fragte. Das heißt, definiert Namespace seine Funktionen bei jedem Zugriff neu? – ktm5124

+0

@ ktm5124 in meinem Fall ist es nicht. Alles, was Sie tun müssen, ist 'neuer Namespace', alles andere ist bereits definiert. Technisch kann man 'Namspace .__ proto __. B();' machen und es wird immer noch ohne den 'neuen' Teil laufen. – Neal

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

note Das Semikolon am Ende

+0

Können Sie bitte weitere Details zu der von Ihnen bereitgestellten Lösung hinzufügen? – abarisone

+0

Das Komma am Ende? Was hat das Komma ('},') nach der Funktion von B mit irgendetwas zu tun? – cpburnz

+0

Entschuldigung, mein Englisch ist nicht gut. Ich will sagen, es ist Semikolon (,). Ich bemerke Semikolon, das verwendet wird, um Komma (;) in snamepace <== GOOGLE STRANSLATE zu beantworten. Ich code immer noch so und es funktioniert. –

Verwandte Themen