454 Kapitel 10
Eine Funktion aus einer Funktion zurückgeben
Bestellungen mit Funktionen erster Klasse entgegennehmen
Jetzt müssen wir überlegen, wie eine Funktion erster Klasse uns in dieser Situation helfen
kann. Hier ist der Plan: Anstatt createDrinkOrder mehrmals pro Passagier aufzurufen,
machen wir das nur einmal. createDrinkOrder gibt uns dann eine Funktion zurück,
die weiß, wie eine Getränkebestellung für diesen Passagier aufgenommen wird. Um eine
Bestellung aufzunehmen, müssen wir jetzt nur noch die zurückgegebene Funktion aufrufen.
Zu Beginn wollen wir createDrinkOrder neu definieren. Rufen wir sie auf, packt sie den
Code für die Getränkebestellung in eine Funktion und gibt uns diese bei Bedarf zurück.
function createDrinkOrder(passenger) {
var orderFunction;
if (passenger.ticket === "Erste Klasse") {
orderFunction = function() {
alert("Möchten Sie einen Cocktail oder Wein?");
};
} else {
orderFunction = function() {
alert("Sie haben die Wahl zwischen Cola und Wasser.");
};
}
return orderFunction;
}
Hier ist die neue createDrinkOrder-Funktion. Sie gibt eine Funktion
zurück, die weiß, wie man eine Getränkebestellung aufnimmt.
Zuerst erstellen wir
eine Variable, in der die
zurückgegebene Funk-
tion gespeichert wird.
Fliegt der Passagier erster Klasse,
erstellen wir eine Funktion, die
weiß, wie man eine entsprechende
Bestellung entgegennimmt.
Ansonsten wird eine
Funktion erstellt, die
eine Bestellung für
die Economy-Klasse
entgegennehmen kann.
Jetzt wollen wir serveCustomer umarbeiten. Zuerst rufen wir createDrinkOrder
auf, um eine Funktion zurückzubekommen, die weiß, wie man die Bestellung für einen
Fluggast entgegennimmt. Diese benutzen wir danach immer wieder, um auch die
Getränkebestellungen für die anderen Passagiere entgegenzunehmen.
function serveCustomer(passenger) {
var getDrinkOrderFunction = createDrinkOrder(passenger);
getDrinkOrderFunction();
// Essensbestellung aufnehmen
getDrinkOrderFunction();
getDrinkOrderFunction();
// Film zeigen
getDrinkOrderFunction();
// Abfall einsammeln
}
Und geben die
Funktion zurück.
Jetzt führen wir den
Code zur Überprüfung der
Ticketklasse des Passagiers
nur noch einmal aus.
Immer wenn wir von diesem Passagier eine
Getränkebestellung aufnehmen wollen,
benutzen wir die von createDrinkOrder
zurückgegebene Funktion.
getDrinkOrder gibt jetzt eine
Funktion zurück, die wir in der
Variablen getDrinkOrderFunction
speichern.
Sie sind hier 455
Funktionen erster Klasse
Probefahrtflug
function servePassengers(passengers) {
for (var i = 0; i < passengers.length; i++) {
serveCustomer(passengers[i]);
}
}
servePassengers(passengers);
Jetzt können wir den neuen Code testen. Hierfür müssen wir schnell noch eine Funktion schreiben, die über
die Passagiere iteriert und für jeden Fluggast die Funktion serveCustomer aufruft. Sobald Sie diesen Code
in Ihre Datei eingebaut haben, können Sie sie im Browser aufrufen und Bestellungen entgegennehmen.
Hier wird einfach eine Schleife über die
Passagiere im Array passengers ausgeführt
und für jeden serveCustomer aufgerufen.
Und natürlich müssen wir servePassengers
aufrufen, damit das alles funktioniert. (Passen
Sie auf, es gibt hier viele Warnmeldungen!)
F:
Nur um sicher zu sein, dass ich
alles verstanden habe … beim Aufruf
von createDrinkOrder erhalten wir eine
Funktion zurück, die wir erneut aufrufen,
um die Getränkebestellung zu bekommen,
richtig?
A:
Das stimmt. Zuerst rufen wir
createDrinkOrder auf, um eine Funktion
mit dem Namen getDrinkOrderFunction
zurückzubekommen. Sie weiß, wie man die
Fluggäste nach einer Bestellung fragt, und
wird jedes Mal aufgerufen, wenn eine Be-
stellung aufgegeben werden soll. Hierbei ist
getDrinkOrderFunction wesentlich einfacher
als createDrinkOrder: getDrinkOrderFunction
gibt einfach eine Meldung aus und bittet um
die Bestellung des Passagiers.
F:
Aber woher weiß getDrinkOrder-
Function, welche Meldung ausgegeben
werden muss?
A:
Das weiß sie, weil wir sie anhand der
Ticketklasse speziell für den Passagier
erstellt haben. Sehen Sie sich createDrink-
Order noch einmal an. Die zurückgegebene
Funktion passt zur Ticketklasse des Flug-
gasts. Befindet er sich in der ersten Klasse,
wird getDrinkOrderFunction so erzeugt, dass
nach einer Getränkebestellung für die erste
Klasse gefragt wird. Haben wir dagegen
einen Economy-Passagier, gibt getDrinkOr-
derFunction auch hier die richtige Aufforde-
rung aus. Durch die Rückgabe der richtigen
Funktion für die Ticketklasse des Fluggasts
ist die Bestellfunktion einfach, schnell und
leicht jedes Mal aufzurufen, wenn eine
Bestellung aufgenommen werden muss.
F:
Dieser Code serviert immer nur
einem Fluggast ein Getränk, zeigt einen
Film usw. Servieren Flugbegleiter norma-
lerweise nicht allen Passagieren, und wird
der Film nicht allen Passagieren gezeigt,
und so weiter?
A:
Glückwunsch, Sie haben unseren
kleinen Test bestanden. Sie haben voll-
kommen recht. Dieser Code wendet die
komplette serveCustomer-Funktion immer
nur auf einen einzelnen Passagier an. In der
wahren Welt ist das natürlich anders. Dieses
einfache Beispiel sollte nur dazu dienen,
einen komplexen Sachverhalt zu demonstrie-
ren (Funktionen zurückzugeben), und es ist
sicher nicht perfekt. Aber nachdem Sie schon
auf unseren Fehler hingewiesen haben,
holen Sie bitte ein Blatt Papier heraus und:
Wie würden Sie den Code
ändern, damit alle Fluggäste
mit Getränken, Abendessen
und einem Film versorgt
werden können, ohne
dass die Ticketklasse für
die Bestellungen immer
wieder neu berechnet
werden muss? Würden Sie
Funktionen erster Klasse
verwenden?
Es gibt keine
Dummen Fragen
Kopf-
nuss

Get JavaScript-Programmierung von Kopf bis Fuß now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.