Searching...
Deutsch
English
Español
简体中文
Français
Deutsch
日本語
Português
Italiano
한국어
Русский
Nederlands
العربية
Polski
हिन्दी
Tiếng Việt
Svenska
Ελληνικά
Türkçe
ไทย
Čeština
Română
Magyar
Українська
Bahasa Indonesia
Dansk
Suomi
Български
עברית
Norsk
Hrvatski
Català
Slovenčina
Lietuvių
Slovenščina
Српски
Eesti
Latviešu
فارسی
മലയാളം
தமிழ்
اردو
Functional JavaScript

Functional JavaScript

Introducing Functional Programming with Underscore.js
by Michael Fogus 2013 258 pages
Programming
Technology
Computer Science
Hören

Wichtige Erkenntnisse

1. JavaScript unterstützt funktionale Programmierung durch erstklassige Funktionen

Eine erstklassige Funktion ist eine, die überall dort eingesetzt werden kann, wo auch andere Werte verwendet werden können – es gibt nur wenige bis keine Einschränkungen.

Funktionen als Werte. In JavaScript können Funktionen Variablen zugewiesen, als Argumente an andere Funktionen übergeben, von Funktionen zurückgegeben und in Datenstrukturen gespeichert werden. Diese Flexibilität ermöglicht funktionale Programmiertechniken. Zum Beispiel:

  • Zuweisung einer Funktion zu einer Variablen: var square = function(x) { return x * x; }
  • Übergabe einer Funktion als Argument: [1, 2, 3].map(function(x) { return x * 2; })
  • Rückgabe einer Funktion: function makeAdder(x) { return function(y) { return x + y; }; }

Diese erstklassige Natur von Funktionen bildet die Grundlage für viele funktionale Programmiermuster in JavaScript.

2. Höhere Ordnungsfunktionen sind der Schlüssel zur funktionalen JavaScript-Programmierung

Höhere Ordnungsfunktionen, die andere Funktionen erfassen, sind eine sehr mächtige Technik zum Aufbau von Abstraktionen.

Mächtige Abstraktionen. Höhere Ordnungsfunktionen nehmen entweder Funktionen als Argumente oder geben Funktionen als Ergebnisse zurück. Sie ermöglichen mächtige Abstraktionen und Code-Wiederverwendung. Häufige Beispiele sind:

  • map: Transformiert jedes Element in einer Sammlung
  • reduce: Kombiniert Elemente einer Sammlung zu einem einzigen Wert
  • filter: Wählt Elemente aus einer Sammlung basierend auf einem Prädikat aus

Diese Funktionen ermöglichen es, komplexe Operationen prägnant auszudrücken und Verhalten zu komponieren. Zum Beispiel:

const numbers = [1, 2, 3, 4, 5];
const evenSquares = numbers
  .filter(x => x % 2 === 0)
  .map(x => x * x);

Dieser Code drückt klar die Absicht aus, gerade Zahlen auszuwählen und zu quadrieren, ohne explizit Schleifen oder Zwischenarrays zu verwalten.

3. Closures ermöglichen mächtige funktionale Techniken in JavaScript

Ein Closure ist eine Funktion, die die externen Bindungen (d. h. nicht ihre eigenen Argumente) erfasst, die im Gültigkeitsbereich enthalten sind, in dem sie definiert wurde, zur späteren Verwendung (auch nachdem dieser Gültigkeitsbereich abgeschlossen ist).

Kapselung und Zustand. Closures ermöglichen es Funktionen, sich an Variablen aus ihrem äußeren Gültigkeitsbereich zu "erinnern" und auf sie zuzugreifen, auch nachdem dieser Gültigkeitsbereich abgeschlossen ist. Dies ermöglicht:

  • Privater Zustand: Erstellen von Variablen, die nur durch bestimmte Funktionen zugänglich sind
  • Funktionsfabriken: Erzeugen spezialisierter Funktionen basierend auf Parametern
  • Partielle Anwendung: Erstellen neuer Funktionen durch Festlegen einiger Argumente bestehender Funktionen

Beispiel für ein Closure, das einen privaten Zustand beibehält:

function counter() {
  let count = 0;
  return function() {
    return ++count;
  };
}

const increment = counter();
increment(); // 1
increment(); // 2

Die Variable count ist nicht direkt zugänglich, aber die zurückgegebene Funktion kann darauf zugreifen und sie ändern.

4. Funktionskomposition ermöglicht den Aufbau komplexer Verhaltensweisen aus einfachen Teilen

Funktionale Programmierung bedeutet, Programme auseinanderzunehmen und sie aus denselben Teilen wieder zusammenzusetzen, abstrahiert hinter Funktionsgrenzen.

Komplexität aufbauen. Funktionskomposition ist der Prozess des Kombinierens von zwei oder mehr Funktionen, um eine neue Funktion zu erstellen. Dies ermöglicht es Ihnen:

  • Komplexe Verhaltensweisen aus einfachen, wiederverwendbaren Teilen zu erstellen
  • Die Lesbarkeit des Codes zu verbessern, indem komplexe Operationen aufgeschlüsselt werden
  • Die Wartbarkeit zu verbessern, indem kleinere Funktionseinheiten isoliert und getestet werden

Komposition kann auf verschiedene Weise erreicht werden:

  • Manuelle Komposition: const f = x => h(g(x))
  • Hilfsfunktionen: const compose = (f, g) => x => f(g(x))
  • Bibliotheken wie Ramda oder Lodash/FP

Beispiel für den Aufbau einer Datenverarbeitungspipeline durch Komposition:

const processData = compose(
  summarize,
  filterOutliers,
  normalize,
  parseInput
);

Dies drückt klar die Schritte der Datenverarbeitung aus, ohne den Code mit Implementierungsdetails zu überladen.

5. Reine Funktionen und Unveränderlichkeit führen zu vorhersehbarerem Code

Programmieren mit reinen Funktionen mag unglaublich einschränkend erscheinen. [...] Wenn Sie jedoch eine libertäre Sichtweise auf Zustandsmutationen einnehmen, schränken Sie tatsächlich Ihre Möglichkeiten zur Komposition ein, erschweren das Durchdenken der Auswirkungen einer beliebigen Anweisung und erschweren das Testen Ihres Codes.

Vorhersehbarkeit und Testbarkeit. Reine Funktionen liefern immer dieselbe Ausgabe für gegebene Eingaben und haben keine Nebeneffekte. Dies, kombiniert mit unveränderlichen Daten:

  • Vereinfacht das Nachvollziehen des Codeverhaltens
  • Erleichtert das Testen und Debuggen
  • Ermöglicht sichere Parallelisierung und Memoisierung

Strategien zur Aufrechterhaltung von Reinheit und Unveränderlichkeit:

  • Verwenden Sie const für Variablen, die sich nicht ändern sollen
  • Erstellen Sie neue Objekte/Arrays anstatt bestehende zu ändern
  • Verwenden Sie Bibliotheken wie Immutable.js für effiziente unveränderliche Datenstrukturen

Beispiel für eine reine Funktion:

function addToCart(cart, item) {
  return [...cart, item];
}

Diese Funktion ändert den ursprünglichen Warenkorb nicht, was es einfacher macht, Änderungen nachzuverfolgen und das Verhalten vorherzusagen.

6. Rekursion bietet eine Alternative zu Schleifen in der funktionalen Programmierung

Durch die Verwendung von Rekursion wird der Zustand über die Funktionsargumente verwaltet, und Änderungen werden über die Argumente von einem rekursiven Aufruf zum nächsten modelliert.

Elegante Lösungen. Rekursion führt oft zu eleganteren und prägnanteren Lösungen für Probleme, die hierarchische oder wiederholte Strukturen beinhalten. Vorteile sind:

  • Natürlicher Ausdruck einiger Algorithmen (z. B. Baumdurchlauf)
  • Vermeidung von veränderlichem Zustand, der oft mit Schleifen verbunden ist
  • Potenzial für Compiler-Optimierungen (Tail-Call-Optimierung)

Seien Sie sich jedoch der Risiken eines Stapelüberlaufs in JavaScript bewusst, das in den meisten Umgebungen keine Tail-Call-Optimierung bietet. Techniken zur Minderung dieses Risikos umfassen:

  • Trampolining: Einwickeln rekursiver Aufrufe in Thunks
  • Continuation-Passing-Stil: Explizite Verwaltung des Aufrufstapels

Beispiel für eine rekursive Funktion zum Flatten eines verschachtelten Arrays:

function flatten(arr) {
  return arr.reduce((flat, next) => 
    flat.concat(Array.isArray(next) ? flatten(next) : next), 
  []);
}

7. Funktionale Programmierung erleichtert Datenfluss- und Transformationspipelines

Pipelines sollen rein sein – keine Daten wurden durch das Durchlaufen beschädigt.

Klare Datenumwandlungen. Funktionale Programmierung ermutigt dazu, in Begriffen von Daten zu denken, die durch eine Reihe von Transformationen fließen. Dieser Ansatz:

  • Verbessert die Lesbarkeit des Codes, indem die Schritte der Datenverarbeitung klar gezeigt werden
  • Erhöht die Wartbarkeit durch Trennung der Anliegen
  • Erleichtert Parallelisierung und Optimierung

Techniken zum Aufbau von Pipelines:

  • Method Chaining (z. B. mit lodash)
  • Komposition reiner Funktionen
  • Spezialisierte Bibliotheken wie RxJS für asynchrone Datenströme

Beispiel für eine Datenverarbeitungspipeline:

const processOrders = pipe(
  fetchOrders,
  filterValidOrders,
  calculateTotals,
  generateReport
);

Dies zeigt klar die Schritte der Auftragsverarbeitung, ohne sich in Implementierungsdetails zu verlieren.

8. Mixin-basierte Gestaltung bietet einen funktionalen Ansatz zur Objektkomposition

Einfache Daten sind am besten. Spezialisierte Datentypen sollten, nun ja, speziell sein.

Flexible Komposition. Mixins bieten eine Möglichkeit, Objektverhalten zu komponieren, ohne auf klassische Vererbung zurückzugreifen. Dieser Ansatz:

  • Ermöglicht eine flexiblere und modularere Codegestaltung
  • Vermeidet Probleme, die mit tiefen Vererbungshierarchien verbunden sind
  • Erleichtert einen funktionaleren Stil der objektorientierten Programmierung

Implementierung von Mixins in JavaScript:

  • Verwenden Sie Object.assign(), um Methoden auf Objektprototypen zu kopieren
  • Verwenden Sie höhere Ordnungsfunktionen, um Fabrikfunktionen zu erstellen, die Mixins anwenden

Beispiel für die Erstellung eines Objekts mit Mixins:

const withLogging = (obj) => ({
  ...obj,
  log: (msg) => console.log(`[${obj.name}]: ${msg}`)
});

const withValidator = (obj) => ({
  ...obj,
  validate: () => { /* Validierungslogik */ }
});

const createUser = (name) => 
  withValidator(withLogging({ name, data: {} }));

Dieser Ansatz ermöglicht eine flexible Komposition von Objektverhalten ohne starre Klassenhierarchien.

Last updated:

Rezensionen

4.07 out of 5
Average of 100+ ratings from Goodreads and Amazon.

Funktionales JavaScript erhält überwiegend positive Bewertungen, mit einer durchschnittlichen Bewertung von 4,07 von 5. Leser schätzen die klare Erklärung der Konzepte der funktionalen Programmierung in JavaScript und loben den unkomplizierten Ansatz sowie die praktischen Beispiele. Viele empfinden es als augenöffnend und wertvoll zur Verbesserung ihrer Programmierfähigkeiten. Einige Rezensenten weisen auf die Dichte des Inhalts hin und empfehlen es für fortgeschrittene Programmierer. Während einige die Abhängigkeit von Underscore.js kritisieren und die Anwendbarkeit in der Praxis in Frage stellen, sind sich die meisten einig, dass es eine solide Einführung in die Techniken der funktionalen Programmierung in JavaScript bietet.

Über den Autor

Michael Fogus ist ein erfahrener Softwareentwickler und Autor, der für seine Expertise im Bereich der funktionalen Programmierung bekannt ist. Er hat mehrere Bücher über Programmierung geschrieben, darunter "The Joy of Clojure" und "Functional JavaScript". Fogus wird für seine Fähigkeit geschätzt, komplexe Konzepte klar und prägnant zu erklären. Seine Arbeit konzentriert sich oft darauf, Prinzipien der funktionalen Programmierung auf verschiedene Sprachen anzuwenden, insbesondere auf JavaScript. Fogus ist auch bekannt für seine Beiträge zur Clojure-Community und seine Beteiligung an der Entwicklung von Programmiersprachen. Sein Schreibstil wird dafür gelobt, dass er direkt und erhellend ist, wodurch schwierige Themen für Leser mit unterschiedlichen Erfahrungsstufen zugänglich werden.

0:00
-0:00
1x
Create a free account to unlock:
Bookmarks – save your favorite books
History – revisit books later
Ratings – rate books & see your ratings
Listening – audio summariesListen to the first takeaway of every book for free, upgrade to Pro for unlimited listening.
Unlock unlimited listening
Your first week's on us!
Today: Get Instant Access
Listen to full summaries of 73,530 books. That's 12,000+ hours of audio!
Day 5: Trial Reminder
We'll send you a notification that your trial is ending soon.
Day 7: Your subscription begins
You'll be charged on Sep 29,
cancel anytime before.
Compare Features Free Pro
Read full text summaries
Summaries are free to read for everyone
Listen to full summaries
Free users can listen to the first takeaway only
Unlimited Bookmarks
Free users are limited to 10
Unlimited History
Free users are limited to 10
What our users say
15,000+ readers
“...I can 10x the number of books I can read...”
“...exceptionally accurate, engaging, and beautifully presented...”
“...better than any amazon review when I'm making a book-buying decision...”
Save 62%
Yearly
$119.88 $44.99/yr
$3.75/mo
Monthly
$9.99/mo
Try Free & Unlock
7 days free, then $44.99/year. Cancel anytime.