Antwort an „Rolf B“ verfassen

problematische Seite

Hallo ebody,

Aber wo wird der Wert von diesem Parameter festgelegt und wo/wie wird dieser Parameter an die anonyme Funktion übergeben?

Ah, ok. Das ist etwas tricky. createFilterFor... ist eine Funktion, die ein Objekt zurückgibt. Und dieses Objekt ist: eine Funktion. Ich zeig's mal einfacher:

function createAdder(summand) {
   return x => x + summand; 
}

let add7 = createAdder(7);
let add2 = createAdder(2);
let summe1 = add7(5);     
let summe2 = add2(9);     
// summe1 enthält jetzt 12 und summe2 enthält 11.

createAdder gibt eine Funktion zurück, nämlich x => x + summand. Der Aufrufer von createAdder nimmt diese Funktion entgegen (speichert sie in add7) und verwendet sie dann: add7(5).

So ähnlich läuft das in meinem Beispiel von vor 4 Tagen. Es wird eine Filterfunktion erzeugt, und die wird dann gleich an die filter-Methode des Arrays übergeben.

Wieso tut man das? Es geht um die Closure, die von der create-Funktion erzeugt wird. Die Closure ist eine interne Eigenschaft der zurückgegebenen Funktion und schließt alle Variablen ein (daher Closure), die beim Erzeugen der Funktion sichtbar und gültig waren. Insbesondere auch den summand-Parameter. createAdder wird oben zweimal aufgerufen. Augenscheinlich erzeugt sie zweimal die gleiche Funktion, aber das stimmt nicht. Es sind zwei verschiedene Funktionsobjekte, und ihre Closure ist unterschiedlich. Die Closure von add7 enthält den Aufrufkontext von createAdder(7), und die Closure von add2 den Aufrufkontext von createAdder(2). Und deswegen addiert add7 den Wert 7 und add2 den Wert 2.

Bei createFilterFor enthält die Closure der zurückgegebenen Funktion den genresToFind Parameter, so dass die Funktion ein movie nach den gewünschten Genres durchsuchen kann.

Das ist ein Einstieg in funktionale Programmierung - je nach Sichtweise die Hölle auf Erden oder aber eine schöne Alternative bzw. Ergänzung zur objektorientierten Programmierung. FP ist nicht neu. Das gab's schon in den 60er Jahren, in Sprachen wie LISP oder APL. Allerdings waren die Computer da noch nicht so richtig dafür geeignet. Fahrt aufgenommen hat das in den letzten 20 Jahren, indem klassische Sprachen funktionale Erweiterungen enthielten. Die ersten FP Sprachen waren rein funktional, was den Einstieg schwer machte. Neuere Sprachen unterstützen funktionale Ansätze, zwingen aber nicht zur FP. Reine FP Sprachen wie Haskell oder Erlang (bzw. dessen Abkömmling Elixier, worin dieses Forum geschrieben ist) sind prozedural aufgewachsenen Wesen wie mir immer noch suspekt.

Rolf

--
sumpsi - posui - obstruxi
freiwillig, öffentlich sichtbar
freiwillig, öffentlich sichtbar
freiwillig, öffentlich sichtbar

Ihre Identität in einem Cookie zu speichern erlaubt es Ihnen, Ihre Beiträge zu editieren. Außerdem müssen Sie dann bei neuen Beiträgen nicht mehr die Felder Name, E-Mail und Homepage ausfüllen.

abbrechen