Hallo,
if (bedingung) {
( function() { ... }() )
}
>
> Mir ist nicht klar, was die öffnende Klammer (ist das eine Parenthese?) unmittelbar for "function()" bedeutet, und warum sie dort steht.
function () {} (); würde einen Syntaxfehler geben, entweder muss die Funktion-Expression oder der ganze Ausdruck geklammert werden (kann ich nicht auf Parsingebene erklären - ist halt so).
> Ich hätte verstanden, wenn dort eine echte Funktionsdeklaration stünde, etwa wie `function myFunc() { }`{:.language-javascript} oder aber auch `myFunc = function () {}`{:.language-javascript}.
Nur function func () { ... } außerhalb eines anderen Statements ist eine echte Funktionsdeklaration (»function deklaration«).
func = function () {}; ist syntaktisch etwas ganz anderes.
1\. Es ist ein Expression Statement,
2. bestehend aus einer Assignment Expression,
3.1 bestehend auf der linken Seite von = mit einem Identifier,
3.2 bestehend auf der rechten Seite von = mit einer Function Expression.
Ausdrücke (Expressions) können in ECMAScript an sehr vielen Stellen vorkommen. In ECMAScript ist vieles ein Ausdruck, was in anderen Sprachen ein Statement ist. Darunter gibt es Function-Expressions (»Funktionsausdrücke«), die für sich wie gesagt einfach ein Funktionsobjekt zurückgeben, ohne das irgendwo zu speichern.
Der Ausdruck »(function () {}) ()« wird wie bei ein mathematischer Term aufgelöst. Der erste geklammerte Teil mit der Function-Expression ein Funktionsobjekt. Darauf wird dann der sogenannte Call-Operator angewendet, das sind die Klammern mit der (hier leeren) Parameterliste.
Übrigens kann man auch func = function bla () {}; schreiben, das ist dann immer noch eine Function-Expression, der Name »bla« hat also keinen Effekt. Deshalb schrieb ich oben »außerhalb eines anderen Statements«. Ohne Kontext kann man nicht beurteilen, ob function func () { ... } eine Declaration oder eine Expression ist.
Mathias
--
»No nations, no borders.«
[SELFHTML Weblog](http://aktuell.de.selfhtml.org/weblog/)