2013-07-22 14 views
7

Powiedzmy mam nazw,Jak wywołać funkcję A z funkcji B w obrębie tej samej przestrzeni nazw?

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

W tej przestrzeni nazw, zamierzam z A do być funkcja pomocnika do B. To znaczy, A() nie zostanie wywołana poza nazw. Będzie on wywoływany tylko przez funkcje w przestrzeni nazw.

Jaki jest najlepszy sposób rozwiązania problemu funkcji lokalnej/pomocniczej w obszarze nazw? Ja widzę to istnieją dwie możliwości:

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

W pierwszej metodzie, jest brzydki i awkard wpisać Namespace.A() (wielokrotnie) w każdej funkcji w przestrzeni nazw. To prowadzi mnie do preferowania metody nr 2. Ale byłem ciekawy, jaka była najlepsza praktyka tutaj.

Odpowiedz

10

I zalecamy umieszczanie „nazw” wewnątrz zakresu funkcji. Wszystko nie jawnie publiczny będzie naturalnie private:

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

To dobre rozwiązanie. Moje pytanie brzmi: czy Przestrzeń nazw przedefiniowuje swoje funkcje za każdym razem, gdy uzyskujesz do niej dostęp? Jeśli tak, byłoby to złe wykorzystanie pamięci. – ktm5124

+0

@ ktm5124: Nie. Funkcja jest uruchamiana natychmiast, a obiekt 'self' jest przypisywany do' Namespace'. – Hubro

+0

@Codemonkey w twoim przypadku nie możesz utworzyć wielu obiektów 'Namespace'. – Neal

5

można nazwać użyciem this oświadczenie

this.A(); 
+6

To nie jest gwarantowane, aby zadzwonić 'Namespace.A'. – Hubro

+0

@Hubro, jeśli piszę przestrzeń nazw zamiast Przestrzeni nazw, to działa dla mnie. – JedatKinports

1

Jeśli zamierzasz używać tylko A wewnątrz B, dlaczego nie definiują go wewnątrz B?

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

     A(); 
    } 
}; 

Namespace.B(); 
+2

Właściwie zamierzam użyć A wewnątrz B, C, D, E, ... czyli wszystkich publicznych funkcji przestrzeni nazw, których jest wiele. (Pominąłem je i włączono tylko B.) – ktm5124

2

Cóż można użyć zdarzenie trzecią opcję, gdzie nazw jest utworzony w jego własnym zakresie:

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

Dzięki Neal, chociaż mam to samo pytanie, które zadałem CodeMonkey w jego odpowiedzi. To znaczy, czy Przestrzeń nazw przedefiniowuje swoje funkcje za każdym razem, gdy uzyskujesz do niej dostęp? – ktm5124

+0

@ ktm5124 w moim przypadku nie. Wszystko, co musisz zrobić, to 'new Namespace' wszystko inne jest już zdefiniowane. Możesz technicznie zrobić 'Namspace .__ proto __. B();' i nadal będzie działał bez "nowej" części. – Neal

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

uwaga średnik na końcu

+0

Czy możesz dodać więcej szczegółów na temat dostarczonego rozwiązania? – abarisone

+0

Przecinek na końcu? Co ma wspólnego przecinek ('},') po funkcji B? – cpburnz

+0

Przepraszam, mój angielski nie jest dobry. Chcę powiedzieć, że jest to średnik (,). Zauważam, że średnik służy do odpowiadania przecinkowi (;) w snamepace <== GOOGLE STRANSLATE. Nadal koduję w ten sam sposób i działa. –

Powiązane problemy