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





3 Answers

Andy Hume hat ziemlich genau die Antwort gegeben, ich möchte nur ein paar weitere Details hinzufügen.

Mit diesem Konstrukt erstellen Sie eine anonyme Funktion mit einer eigenen Evaluierungsumgebung oder einem Abschluss, und Sie bewerten sie sofort. Das Schöne daran ist, dass Sie auf die Variablen zugreifen können, die vor der anonymen Funktion deklariert wurden, und Sie können lokale Variablen innerhalb dieser Funktion verwenden, ohne versehentlich eine vorhandene Variable zu überschreiben.

Die Verwendung des Schlüsselworts var ist sehr wichtig, da in JavaScript jede Variable standardmäßig global ist, aber mit dem Schlüsselwort eine neue lexikalisch begrenzte Variable erstellt wird, dh sie ist durch den Code zwischen den beiden geschweiften Klammern sichtbar. In Ihrem Beispiel erstellen Sie im Wesentlichen kurze Aliase für die Objekte in der YUI-Bibliothek, aber sie sind leistungsfähiger.

Ich möchte Sie nicht ohne ein Codebeispiel verlassen, also werde ich hier ein einfaches Beispiel vorstellen, um eine Schließung zu veranschaulichen:

var add_gen = function(n) {
  return function(x) {
    return n + x;
  };
};
var add2 = add_gen(2);
add2(3); // result is 5

Was geht hier vor sich? In der Funktion add_gen erstellen Sie eine weitere Funktion, die einfach die Zahl n zu ihrem Argument hinzufügt. Der Trick besteht darin, dass in den Variablen, die in der Funktionsparameterliste definiert sind, lexikalisch definierte Variablen wirken, wie sie mit var definiert sind.

Die zurückgegebene Funktion wird zwischen den geschweiften Klammern der Funktion add_gen definiert , so dass sie auch nach der Ausführung der Funktion add_gen auf den Wert von n zugreifen kann. Deshalb erhalten Sie 5, wenn Sie die letzte Zeile des Beispiels ausführen.

Mit Hilfe von lexikalisch definierten Funktionsparametern können Sie die "Probleme" umgehen, die sich aus der Verwendung von Schleifenvariablen in anonymen Funktionen ergeben. Nehmen Sie ein einfaches Beispiel:

for(var i=0; i<5; i++) {
  setTimeout(function(){alert(i)}, 10);
}

Das "erwartete" Ergebnis könnte die Zahlen von Null bis Vier sein, aber Sie erhalten stattdessen vier Instanzen von Fünfen. Dies geschieht, weil die anonyme Funktion in setTimeout und die for-Schleife dieselbe i- Variable verwenden. Wenn die Funktionen also ausgewertet werden, bin ich 5.

Sie können das naiv erwartete Ergebnis erhalten, indem Sie die Technik in Ihrer Frage verwenden und die Tatsache, dass Funktionsparameter lexikalisch sind. (Ich habe diesen Ansatz in einer anderen Antwort verwendet )

for(var i=0; i<5; i++) {
  setTimeout(
     (function(j) {
       return function(){alert(j)};
     })(i), 10);
}

Mit der sofortigen Auswertung der äußeren Funktion erstellen Sie in jeder Iteration eine vollständig unabhängige Variable mit dem Namen j , und der aktuelle Wert von i wird in diese Variable kopiert , so dass Sie das Ergebnis erhalten, was beim ersten Versuch naiv erwartet wurde.

Ich schlage vor, dass Sie versuchen, das exzellente Tutorial unter http://ejohn.org/apps/learn/ zu verstehen, um die Schließungen besser zu verstehen, wo ich sehr, sehr viel gelernt habe.

javascript syntax

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?




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.




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






Related