2013-07-22 9 views
7

Diciamo che ho lo spazio dei nomi,Come chiamare la funzione A dalla funzione B all'interno dello stesso spazio dei nomi?

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

In questo spazio dei nomi, intendo per A sia una funzione di supporto a B. Vale a dire, A() non verrà mai chiamato al di fuori dello spazio dei nomi. Sarà chiamato solo dalle funzioni all'interno del namespace.

Qual è il modo migliore per risolvere il problema di una funzione locale/di supporto all'interno di un namespace? Il modo di vedere ci sono due possibilità:

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

Nel primo metodo, è brutto e awkard digitare Namespace.A() (ripetutamente) in ogni funzione all'interno del namespace. Questo mi porta a preferire il Metodo # 2. Ma ero curioso di sapere quale fosse la migliore pratica qui.

risposta

10

mi consiglia di collocare il "namespace" all'interno di un insieme di funzioni. Tutto quanto non espressamente pubblico sarà naturalmente privato:

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

Questa è una bella soluzione. La mia domanda è, Namespace ridefinisce le sue funzioni ogni volta che le accedi? Se è così, sarebbe un cattivo uso della memoria. – ktm5124

+0

@ ktm5124: No. La funzione viene eseguita immediatamente e l'oggetto 'self' è assegnato a' Namespace'. – Hubro

+0

@Codemonkey nel tuo caso non puoi creare più oggetti 'Namespace'. – Neal

5

Si può chiamare usando this dichiarazione

this.A(); 
+6

Questo non è garantito a chiamare 'Namespace.A'. – Hubro

+0

@Hubro se scrivo namespace invece di Namespace, funziona per me. – JedatKinports

1

Se si intende utilizzare solo A all'interno B, perché non definirlo all'interno B?

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

     A(); 
    } 
}; 

Namespace.B(); 
+2

In realtà intendo usare A all'interno di B, C, D, E, ... cioè, tutte le funzioni del namespace pubblico, che sono molte. (Li ho omessi e incluso solo B.) – ktm5124

2

Ebbene si può evento utilizzare una terza opzione in cui viene creato il namespace in essa la propria portata:

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

Grazie Neal, anche se ho la stessa domanda che ho chiesto a CodeMonkey nella sua risposta. Cioè, Namespace ridefinisce le sue funzioni ogni volta che le accedi? – ktm5124

+0

@ ktm5124 nel mio caso non è così. Tutto quello che devi fare è 'new Namespace', tutto il resto è già definito. Puoi tecnicamente fare 'Namspace .__ proto __. B();' e funzionerà ancora senza la parte 'new'. – Neal

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

nota il punto e virgola alla fine

+0

Potresti aggiungere ulteriori dettagli sulla soluzione che offri? – abarisone

+0

La virgola alla fine? Cosa ha a che fare la virgola ('},') dopo la funzione di B di qualcosa? – cpburnz

+0

scusate, il mio inglese non è buono. Voglio dire che è semi-colon (,). Prendo nota del punto e virgola usato per rispondere alla virgola (;) in snamepace <== GOOGLE STRANSLATE. Ho ancora il codice in questo modo e funziona. –

Problemi correlati