Facebook Pixel
Searching...
Deutsch
EnglishEnglish
EspañolSpanish
简体中文Chinese
FrançaisFrench
DeutschGerman
日本語Japanese
PortuguêsPortuguese
ItalianoItalian
한국어Korean
РусскийRussian
NederlandsDutch
العربيةArabic
PolskiPolish
हिन्दीHindi
Tiếng ViệtVietnamese
SvenskaSwedish
ΕλληνικάGreek
TürkçeTurkish
ไทยThai
ČeštinaCzech
RomânăRomanian
MagyarHungarian
УкраїнськаUkrainian
Bahasa IndonesiaIndonesian
DanskDanish
SuomiFinnish
БългарскиBulgarian
עבריתHebrew
NorskNorwegian
HrvatskiCroatian
CatalàCatalan
SlovenčinaSlovak
LietuviųLithuanian
SlovenščinaSlovenian
СрпскиSerbian
EestiEstonian
LatviešuLatvian
فارسیPersian
മലയാളംMalayalam
தமிழ்Tamil
اردوUrdu
Functional JavaScript

Functional JavaScript

Introducing Functional Programming with Underscore.js
von Michael Fogus 2013 258 Seiten
4.07
100+ Bewertungen
Hören
Listen to Summary

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.

Zuletzt aktualisiert:

FAQ

What's Functional JavaScript about?

  • Focus on Functional Programming: Functional JavaScript by Michael Fogus introduces readers to functional programming concepts using JavaScript, with a particular emphasis on the Underscore.js library.
  • Core Principles: The book highlights the importance of treating functions as first-class citizens, which allows for more modular and maintainable code.
  • Practical Applications: It covers techniques like higher-order functions, recursion, and function composition, making it useful for both novice and experienced developers.

Why should I read Functional JavaScript?

  • Enhance JavaScript Skills: The book deepens your understanding of JavaScript by exploring functional programming paradigms, leading to cleaner and more efficient code.
  • Real-World Examples: It includes numerous examples and exercises that demonstrate how to apply functional programming concepts in everyday coding scenarios.
  • Broaden Programming Paradigms: By reading this book, you can expand your programming toolkit, making you a more versatile developer capable of tackling complex problems.

What are the key takeaways of Functional JavaScript?

  • First-Class Functions: Functions in JavaScript can be treated like any other value, allowing for powerful programming techniques.
  • Higher-Order Functions: Creating and using higher-order functions is crucial, as they enable functions to accept other functions as arguments or return them.
  • Recursion and Closures: The book covers recursion for problem-solving and closures for maintaining state in a functional programming context.

What is a higher-order function in Functional JavaScript?

  • Definition: A higher-order function is one that takes one or more functions as arguments or returns a function as its result.
  • Examples in the Book: Functions like _.map, _.filter, and _.reduce are highlighted as higher-order functions that operate on collections and accept callback functions.
  • Importance: Higher-order functions allow for more abstract and reusable code, enabling developers to create more flexible and modular applications.

How does Functional JavaScript explain recursion?

  • Recursive Definition: Recursion is defined as a function that calls itself to solve smaller instances of the same problem, such as calculating the length of an array.
  • Example Implementation: An example provided is the myLength function, which uses recursion to determine the length of an array by checking if it is empty and adding one for each element.
  • Benefits of Recursion: Recursion can simplify complex problems by breaking them down into smaller, more manageable parts, making code easier to read and maintain.

What are closures, as described in Functional JavaScript?

  • Definition of Closures: A closure is a function that captures the lexical scope in which it was defined, allowing it to access variables from that scope even after the outer function has finished executing.
  • Practical Use: The book illustrates closures with examples like makeAdder, which creates functions that remember their captured variables, enabling stateful behavior.
  • Significance: Understanding closures is essential for mastering JavaScript, as they are a fundamental concept that allows for data encapsulation and function factories.

How does Functional JavaScript define currying?

  • Definition of Currying: Currying is the process of transforming a function that takes multiple arguments into a sequence of functions that each take a single argument.
  • Example in the Book: The book provides an example of a curried function that allows for partial application of arguments, making it easier to create specialized functions.
  • Benefits of Currying: Currying enhances code reusability and flexibility, allowing developers to create more modular and composable functions.

What is the role of Underscore.js in Functional JavaScript?

  • Utility Library: Underscore.js is used throughout the book as a utility library that provides functional programming support in JavaScript, offering functions like map, reduce, and filter.
  • Facilitates Learning: The library simplifies the implementation of functional programming concepts, allowing readers to focus on understanding the principles rather than getting bogged down in low-level details.
  • Integration with JavaScript: The book demonstrates how to leverage Underscore.js to write cleaner, more functional JavaScript code, making it a practical resource for developers.

How does Functional JavaScript address immutability?

  • Importance of Immutability: The book stresses that immutability is a key principle in functional programming. By avoiding mutable state, developers can create more predictable and maintainable code.
  • Techniques for Immutability: Fogus discusses various techniques for achieving immutability in JavaScript, such as using Object.freeze and creating deep clones of objects.
  • Immutability in Practice: The author provides examples of how to implement immutability in real-world applications, demonstrating its benefits in terms of code clarity and reliability.

What are some best practices from Functional JavaScript?

  • Avoid Side Effects: The book emphasizes writing pure functions that do not modify external state, which leads to more predictable and testable code.
  • Use Higher-Order Functions: Leveraging higher-order functions can help create more abstract and reusable code, making it easier to manage complexity.
  • Embrace Recursion and Closures: Understanding and effectively using recursion and closures can enhance your ability to write functional JavaScript, allowing for elegant solutions to complex problems.

What are some practical examples from Functional JavaScript?

  • Building a Simple Validator: The book includes a section on creating a simple validation function that checks input values, illustrating how to apply functional programming principles to real-world scenarios.
  • Using Higher-Order Functions: Fogus provides examples of higher-order functions, such as map and filter, showing how they can be used to manipulate data collections effectively.
  • Creating a Lazy Chain: The author demonstrates how to implement a lazy chain of function calls, allowing for deferred execution of operations, showcasing the flexibility and power of functional programming techniques.

What are the best quotes from Functional JavaScript and what do they mean?

  • "Functional programming is the use of functions that transform values into units of abstraction, subsequently used to build software systems.": This quote encapsulates the essence of functional programming as described in the book.
  • "Purity is the key to predictability.": This emphasizes the importance of writing pure functions in functional programming, leading to more predictable behavior.
  • "Composition is the essence of functional programming.": This underscores the significance of function composition, a fundamental technique that enhances code reusability and clarity.

Rezensionen

4.07 von 5
Durchschnitt von 100+ Bewertungen von Goodreads und 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
Dan
Andrew
Michelle
Lauren
Select Speed
1.0×
+
200 words per minute
Home
Library
Get App
Create a free account to unlock:
Requests: Request new book summaries
Bookmarks: Save your favorite books
History: Revisit books later
Recommendations: Get personalized suggestions
Ratings: Rate books & see your ratings
Try Full Access for 7 Days
Listen, bookmark, and more
Compare Features Free Pro
📖 Read Summaries
All summaries are free to read in 40 languages
🎧 Listen to Summaries
Listen to unlimited summaries in 40 languages
❤️ Unlimited Bookmarks
Free users are limited to 10
📜 Unlimited History
Free users are limited to 10
Risk-Free Timeline
Today: Get Instant Access
Listen to full summaries of 73,530 books. That's 12,000+ hours of audio!
Day 4: Trial Reminder
We'll send you a notification that your trial is ending soon.
Day 7: Your subscription begins
You'll be charged on Apr 26,
cancel anytime before.
Consume 2.8x More Books
2.8x more books Listening Reading
Our users love us
100,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/year
$3.75/mo
Monthly
$9.99/mo
Try Free & Unlock
7 days free, then $44.99/year. Cancel anytime.
Scanner
Find a barcode to scan

Settings
General
Widget
Appearance
Loading...
Black Friday Sale 🎉
$20 off Lifetime Access
$79.99 $59.99
Upgrade Now →