• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Closures und Module bzw immediate Function

vsenol

Mitglied
Hallo Leute,

es geht um ein Codebeispiel aus Oliver Ochs´ JavaScript für Enterprise-Entwickler vom dpunkt.verlag:

var incrementor = function () {
var variable = 0;
return {
inc : function () {
return variable ++;
}
};
} ();

print(incrementor.inc()); // 0
print(incrementor.inc()); // 1
print(incrementor.inc); // undefined


Ich habe eh meine Schwierigkeiten, das eine oder andere zu verstehen, was mir aber enorme Schwirigkeiten macht, sind die grün gekennzeichneten Klammern. Diese sollen wohl zur anonymen Funktion incrementor gehören, das Problem ist, dass diese keinen Sinn ergeben, entweder sind sie schlichtweg zu viel oder der Autor wollte eine immediate Function hier haben und es wurde ein Klammernpaar um die anonyme Funktion vergessen oder ich habe einfach in meinen Studien etw übersehen und verstehe die Syntax nicht.

Nun weiterhin wäre ich dankbar wenn mir jmd erklären kann warum das erste Ergebnis der printausgabe 0 ist obwohl ein ++ hinter der variable notiert ist.

vielen Dank im vorraus
 
Werbung:
Die grünen Klammern bewirken, dass die Funktion ausgeführt wird und ihr Rückgabewert in der Variablen gespeichet wird. Die Variable incrementor enthält anschließend ein Objekt mit der Funktion inc drin, die man dann aufrufen kann. Ohne diese Klammern würde die Variable nur die anonyme Funktion enthalten.
Ich hatte selber große Probleme, dieses Konstrukt zu verstehen, bis ich diese Erklärung gefunden habe:
http://molily.de/js/organisation-module.html
Hoffe, ich habe es jetzt richtig erklärt.
Dass der Aufruf der Funktion inc beim ersten Mal 0 liefert, liegt daran, dass das ++ hinter der Variablen steht. In dem Fall wird das Inkrementieren erst nach der Zuweisung ausgeführt.
 
Ich habe eh meine Schwierigkeiten, das eine oder andere zu verstehen, was mir aber enorme Schwirigkeiten macht, sind die grün gekennzeichneten Klammern.

Das ist ein JavaScript Design Pattern, genannt Immediately Invoked Function Expression (IIFE), welches die Funktion ausführt, ohne dass diese extra aufgerufen werden muss:
Code:
var foo = function() {
  alert('bar');
}();

// macht dasselbe wie:
var foo = function() {
  alert('bar');
};
foo();
 
Werbung:
Tipp: Man stößt in der Programmierung gelegentlich auf komplexe Konstrukte, deren Funktionsweise einem sich nicht auf Anhieb erschließt, sogenannte "Black Boxes". Mit häufigem Einsatz werden sie dann aber nach und nach verständlich.
 
hallo nochmals,

vielen Dank für eure Hilfe, hätte aber noch einen Nachtrag:
Undzwar sind mir seit kurzem immediately invoked functions durchaus bekannt, nur dann es dann fehlt ein zusätzliches Klammernpaar , welches die gesamte anonyme Funktion umschliessen müsste.

Also es müsste doch dann so sein, (die zusätzlichen Klammern [sprich die fehlenden] kennzeichne ich mal ebenfalls grün).


<code>
var incrementor = (function () {
var variable = 0;
return {
inc : function () {
return variable ++;
}
};
}) ();
</code>


Werde der Sache nochmal auf den Grund gehen.

Vielen Dank alle Beiträge bzw. Antworten haben mir weitergeholfen.
 
Ok, ich habe die Lösung im Buch JavaScript Pattern, Stoyan Stefanov gefunden. Werde euch dazu morgen was schreiben, denn das dürfte für den einen oder anderen interessant sein
 
Werbung:
Also hier ein Zitat aus JavaScript Patterns, Stoyan Stefanov, o´reilly, Kapitel Funktionen, Absatz Immediate Function:

Die Syntax ist klar definiert und sieht so aus:

(function () {
CODE;​
}()); // JSLint bevorzugt diese Syntax

oder alternativ:

(function () {
CODE;​
})();


Zu diesem Codebeispiel schreibt Herr Stefanov:

Dieses Muster ist eig nicht mehr als ein Funktions-Ausdruck (benannt oder anonym), der direkt nach seinem Erstellen ausgeführt wird. Der Begriff Immediate Function ist im ECMAScript-Standard nicht definiert, aber er ist prägnant und hilft beim Beschreiben und Erläutern des Musters.

Das Muster setzt sich wie folgt zusammen:
  • Sie definieren eine Funktion mit Hilfe eines Funktions-Ausdrucks. (Eine Funktions-Deklaration hilft hier nicht.)
  • Sie fügen am Ende ein Klammernpaar ein, wodurch die Funktion sofort ausgeführt wird.
  • Sie umschließen die gesamte Funktion mit Klammern (nur wenn Sie die Funktion keiner Variablen zuweisen).

Warum das so ist, konnte ich nicht herausfinden, vermute jedoch, dass die umschließenden Klammern notwendig sind, damit der Interpreter es als eine Einheit sieht, was bei einer Variablenzuweisung eindeutig erscheint.
 
Zurück
Oben