2013-08-24 12 views
7

Edit für Klarheit - @ Qantas94Heavy - Ich verstehe, was es ist „sagen“ oder tun sollte, was ich nicht verstehe, warum & mehr ist wichtig wie es funktioniert:JavaScript Design Patterns Hilfe benötigt: Los Augmentation Modul

ich war ein fortgeschrittenes Tutorial auf der JS-Modul Muster zu lesen, und es gab dieses Beispiel:

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

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

was mich nervt (und ich brauche deine Hilfe) ist die letzte Aussage:

(MODULE || {})); 

Ich habe Probleme beim Verständnis der Syntax Regeln dahinter, die es möglich machen. Nach einiger Suche nach Schlüsselwörtern, "JavaScript Module Syntax" und "Module Pattern Short Hand" stellte ich fest, dass ich die zugrunde liegende Basis immer noch nicht richtig verstehe.

Würde jemand bitte erklären oder zeigen Sie mir in die richtige Richtung für das Grokking// ein tieferes Verständnis zu gewinnen?

Mit freundlichen Grüßen, GGGI

+2

Es ist entweder Leiten einen bereits definierten Teils des Moduls oder wenn es nicht vorhanden ist, um ein neues Objekt für das Modul zu schaffen - die Funktion sofort aufgerufen wird, Übergeben des Ergebnisses der Funktion an die Zuweisung. –

+1

@ Qantas94Heavy Warum nicht als Antwort statt als Kommentar schreiben? – Bart

+0

@ Qantas94Heavy - Ich verstehe, was es sagt oder tun soll, was ich nicht verstehe ist * warum * und noch wichtiger * wie * es funktioniert. – gogogadgetinternet

Antwort

7
(function(){ 

})(); 

ist eine selbst Aufrufen anonyme Funktion. In Ihrem Fall behandelt es den Objektparameter "my": Es tut etwas zu "my" und gibt es dann zurück.

In Ihrem Fall ist der "my" Parameter, den die Funktion empfängt, "(MODULE || {})".

Die & & und || Betreiber werden Kurzschlussoperatoren genannt. || Wenn das "MODULE" -Objekt vorhanden ist, wird das "MODULE" -Objekt zurückgegeben, andernfalls wird ein leeres Objekt erstellt, das innerhalb der Funktion verwendet werden kann. Die Funktion wird tun, was auch immer sie mit dem Objekt macht, das zum zurückgegebenen "MODUL" -Objekt wird.

Es funktioniert durch Erstellen einer Schließung: Solange Modul vorhanden ist (es ist nicht Müll gesammelt), so die selbstaufrufende anonyme Funktion zusammen mit seinem Zustand zum Zeitpunkt der Zuweisung. Dies macht alle Fähigkeiten, die hinzugefügt werden, um persistent zu sein.

+0

Danke @ itmitica - Ich denke, die Art und Weise, wie mir das erklärt wurde, führte mich zu der Annahme, dass hier mehr vor sich geht als die einfache Kurzschrift, wenn man feststellt, was passiert ist! Im Nachhinein ist das ganz einfach. – gogogadgetinternet

3

Die rechte Seite heißt sofortige Funktion. Um zu verstehen, wie es funktioniert, machen sie es bricht ein wenig nach unten:

  1. (...)() wir eine Funktion mit Namen nennen können, das heißt f(). Aber anstelle des Funktionsnamens können wir einen beliebigen Ausdruck setzen, der in eine Variable vom Typ function aufgelöst wird. In unserem Fall enthält die erste Klammer nur einen Ausdruck. Der zweite Satz ist der Funktionsaufruf-Operator. Letztendlich entspricht (f)() exakt f()

  2. Der zweite Schritt besteht darin, eine anonyme Funktion innerhalb des ersten Klammersatzes bereitzustellen. Das Ergebnis ist: (function(){})(). Die anonyme Funktion ist perfekt vom Typ function. Dies bewirkt, dass die Funktion in derselben Anweisung erstellt, ausgeführt und verworfen wird.

  3. Der zweite Klammersatz, der der Funktionsaufrufoperator ist, kann Parameter darin akzeptieren, was in unserem Fall MODULE || {} ist.Dieser Ausdruck bedeutet: Wenn MODULE definiert ist, verwenden Sie ihn, andernfalls erstellen Sie einen neuen leeren.

  4. Der Parameter wird an die anonyme Funktion als ein Argument mit dem Namen my übergeben und die anonyme Funktion gibt zurück, um, my. Dies bewirkt, dass die anonyme Funktion zu my ausgewertet wird und in Wirklichkeit: (my)(MODULE || {}).

  5. Der Effekt ist MODULE ist in sich abgeschlossen und verursacht keine Namenskonflikte mit externen Variablen. In der gleichen Zeit hat es Zugriff auf externe Variablen.

Ich hoffe, das es löscht :)