2013-08-24 15 views
7

Edit dla jasności - @ Qantas94Heavy - Rozumiem, co to jest „powiedzenie” lub robić, co nie rozumiem dlaczego jest & ważniejsze jak to działa:Wzorce projektowe JavaScript Pomoc potrzebna: Luźny Powiększanie modułów

czytałem zaawansowany samouczek na wzór JS moduł, a on dał ten przykład:

var MODULE = (function (my) { 
// add capabilities... 

return my; 
}(MODULE || {})); 

The rzeczą, która jest bugging mnie (a ja potrzebuję twojej pomocy) to ostatnie oświadczenie:

(MODULE || {})); 

Mam problem ze zrozumieniem zasad składni, które stoją za tym, które umożliwiają. Po przeprowadzeniu wyszukiwania słów kluczowych, "Składni modułu JavaScript" i "Wzorcowego wzorca modułu" odkryłem, że wciąż nie rozumiem podstaw, które za tym stoją.

Czy ktoś mógłby wyjaśnić lub wskazać mi właściwy kierunek, aby to osiągnąć/uzyskać głębsze zrozumienie?

poważaniem gggi

+2

to albo przechodząc już zdefiniowaną część modułu lub jeśli nie istnieje, tworząc nowy obiekt dla modułu - funkcja nazywa się natychmiast, przekazanie wyniku funkcji do przypisania. –

+1

@ Qantas94Heavy Dlaczego nie zapisać go jako odpowiedzi zamiast komentarza? – Bart

+0

@ Qantas94Heavy - Rozumiem, co to "powiedzenie" lub co powinienem zrobić, czego nie rozumiem, to * dlaczego * i co ważniejsze * jak * działa. – gogogadgetinternet

Odpowiedz

7
(function(){ 

})(); 

jest samodzielnym powołując anonimowa funkcja. W twoim przypadku obsługuje on "mój" parametr obiektu: robi coś "mojemu", a następnie zwraca go z powrotem.

W twoim przypadku "mój" parametr, który otrzymuje funkcja, to "(MODUŁ || {})".

The & & i || operatorzy nazywani są operatorami zwarciowymi. || powróci, jeśli istnieje obiekt "MODUŁ", obiekt "MODUŁ", w przeciwnym razie zostanie utworzony pusty obiekt do użycia wewnątrz funkcji. Funkcja zrobi wszystko, co robi z tym obiektem, który stanie się zwróconym obiektem "MODUŁ".

Działa poprzez utworzenie zamknięcia: tak długo, jak istnieje MODUŁ (nie jest to zbędne gromadzenie śmieci), tak samo wywołuje anonimową funkcję wraz z jej stanem w momencie przypisania. Dzięki temu wszelkie dodane możliwości są trwałe.

+0

Dziękuję @ itmitică - Sądzę, że sposób, w jaki to mi wyjaśniono, doprowadził mnie do przekonania, że ​​jest coś więcej niż zwykły skrót, jeśli chodzi o ustalenie, co zostało przekazane! Z perspektywy czasu jest to dość proste. – gogogadgetinternet

3

Prawą stronę nazywa się funkcją natychmiastową. Aby zrozumieć, jak to działa, niech rozbicie go trochę:

  1. (...)() możemy wywołać funkcję po imieniu, tj f(). Ale zamiast nazwy funkcji możemy umieścić dowolne wyrażenie o rozmiarze , które rozdziela na zmienną typu. W naszym przypadku pierwszy zestaw nawiasów zamyka jedynie wyrażenie. Drugi zestaw to operator wywołania funkcji. Ostatecznie, (f)() jest równoznaczne z f()

  2. Drugim krokiem jest zapewnienie anonimowej funkcji w pierwszym zestawie nawiasów. Rezultat: (function(){})(). Anonimowa funkcja jest doskonale typu. Powoduje to, że funkcja jest tworzona, wykonywana i odrzucana w tej samej instrukcji.

  3. Drugi zestaw nawiasów, który jest operatorem wywołania funkcji, może akceptować parametry wewnątrz niego, co jest w naszym przypadku MODULE || {}.To wyrażenie oznacza: jeśli zdefiniowano MODULE, użyj go, w przeciwnym razie utwórz nowy pusty.

  4. Parametr jest przekazywany do funkcji anonimowej jako argument o nazwie my, a funkcja anonimowa zwraca, um, my. Powoduje to, że anonimowa funkcja oceni na my, aw efekcie: (my)(MODULE || {}).

  5. Efekt: MODULE jest niezależny i nie powoduje konfliktów nazw ze zmiennymi zewnętrznymi. W tym samym czasie ma dostęp do zmiennych zewnętrznych.

Mam nadzieję, że ściąga piłkę :)

Powiązane problemy