javascript groß - Was bedeuten Klammern um eine Objekt / Funktion / Klassen-Deklaration?





und kleinschreibung (7)


Siehe diese Frage . Der erste Klammersatz ist nicht erforderlich, wenn Sie einen Funktionsnamen verwenden, aber eine namenlose Funktion erfordert dieses Konstrukt, und die Klammern dienen Codierern zu erkennen, dass sie eine selbstaufrufende Funktion beim Durchsuchen des Codes anzeigen (siehe den besten Blogger) Praxisempfehlung ).

Diese Frage hat hier bereits eine Antwort:

Ich bin neu in JavaScript und YUI . In YUI-Bibliotheksbeispielen finden Sie viele Verwendungen dieses Konstrukts:

(function() {
    var Dom = YAHOO.util.Dom,
    Event = YAHOO.util.Event,
    layout = null,
        ...
})();

Ich denke, die letzten paar Klammern sollen die Funktion direkt nach der Deklaration ausführen.

... Aber was ist mit dem vorherigen Satz von Klammern, der die Funktionsdeklaration umgibt?

Ich denke, es ist eine Frage des Umfangs; das heißt, innerhalb von Variablen zu externen Funktionen und möglicherweise globalen Objekten zu verbergen. Ist es? Allgemeiner, was ist die Mechanik dieser Klammern?




Es ist eine selbst-ausführende anonyme Funktion. Der erste Satz von Klammern enthält die auszuführenden Ausdrücke, und der zweite Satz von Klammern führt diese Ausdrücke aus.

Es ist ein nützliches Konstrukt, wenn Sie versuchen, Variablen aus dem übergeordneten Namespace auszublenden. Der gesamte Code innerhalb der Funktion ist im privaten Bereich der Funktion enthalten, was bedeutet, dass er nicht von außerhalb der Funktion aufgerufen werden kann, wodurch er wirklich privat ist.

Sehen:

http://en.wikipedia.org/wiki/Closure_%28computer_science%29

http://peter.michaux.ca/articles/javascript-namespacing




Juts, um zu verfolgen, was Andy Hume und andere gesagt haben:

Das '()' um die anonyme Funktion herum ist der Gruppierungsoperator, wie in Abschnitt 11.1.6 der ECMA-Spezifikation definiert: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf .

Wörtlich aus den Dokumenten übernommen:

11.1.6 Der Gruppierungsoperator

Die Produktion PrimaryExpression : ( Expression ) wird wie folgt ausgewertet:

  1. Gibt das Ergebnis der Auswertung von Expression zurück . Dies kann vom Typ Referenz sein.

In diesem Kontext wird die Funktion als Ausdruck behandelt.




Ein paar Überlegungen zu diesem Thema:

  • Die Klammer:

    Der Browser (Engine / Parser) ordnet die Schlüsselwortfunktion zu

    [optional name]([optional parameters]){...code...}
    

    Also in einem Ausdruck wie function () {} () macht die letzte Klammer keinen Sinn.

    Jetzt denke an

    name=function(){} ; name() !?
    

Ja, das erste Paar Klammern zwingt die anonyme Funktion, sich in eine Variable (gespeicherter Ausdruck) zu verwandeln, und die zweite startet die Auswertung / Ausführung, so dass ( function () {} ) () Sinn macht.

  • Das Dienstprogramm:?

    1. Zum Ausführen von Code beim Laden und Isolieren der verwendeten Variablen vom Rest der Seite, insbesondere wenn Namenskonflikte möglich sind;

    2. Ersetzen Sie eval ("string") durch

      (neue Funktion ("String")) ()

    3. Wrap langen Code für " = ?: " Operator wie:

      Ergebnis = exp_to_test? (function () {... long_code ...}) (): (function () {...}) ();




... aber was ist mit den vorherigen Runde parenteses alle Funktionsdeklaration?

Insbesondere lässt JavaScript das Konstrukt "function () {...}" als inline-anonymen Funktionsausdruck interpretieren. Wenn Sie die Klammern weggelassen haben:

function() {
    alert('hello');
}();

Sie erhalten einen Syntaxfehler, weil der JS-Parser das Schlüsselwort 'function' sehen würde und davon ausgeht, dass Sie eine Funktionsanweisung des Formulars starten:

function doSomething() {
}

... und Sie können keine Funktionsanweisung ohne Funktionsnamen haben.

Funktionsausdrücke und Funktionsanweisungen sind zwei verschiedene Konstrukte, die auf sehr unterschiedliche Weise behandelt werden. Leider ist die Syntax fast identisch, daher ist es nicht nur verwirrend für den Programmierer, selbst der Parser hat Schwierigkeiten zu sagen, was du meinst!




Die ersten Klammern sind, wenn Sie so wollen, die Reihenfolge der Operationen. Das 'Ergebnis' der Klammern, die die Funktionsdefinition umgeben, ist die Funktion selbst, die tatsächlich die zweite Klammer ausführt.

Warum es nützlich ist, ich bin nicht genug von einem JavaScript-Assistenten, um eine Idee zu haben. : P




In C hat statisch zwei Bedeutungen, abhängig vom Umfang seiner Verwendung. Wenn ein Objekt im globalen Gültigkeitsbereich auf Dateiebene deklariert wird, bedeutet dies, dass dieses Objekt nur in dieser Datei sichtbar ist.

In jedem anderen Bereich deklariert es ein Objekt, das seinen Wert zwischen den verschiedenen Zeiten behält, zu denen der bestimmte Bereich eingegeben wird. Wenn beispielsweise ein Int innerhalb einer Prozedur delcared ist:

void procedure(void)
{
   static int i = 0;

   i++;
}

Der Wert von 'i' wird beim ersten Aufruf der Prozedur auf Null initialisiert, und der Wert wird bei jedem nachfolgenden Aufruf der Prozedur beibehalten. Wenn 'i' gedruckt würde, würde es eine Folge von 0, 1, 2, 3, ... ausgeben.





javascript syntax