Facebook Pixel
Searching...
Français
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
par Michael Fogus 2013 258 pages
4.07
100+ évaluations
Écouter
Listen to Summary

Points clés

1. JavaScript prend en charge la programmation fonctionnelle grâce aux fonctions de première classe

Une fonction de première classe est une fonction qui peut être utilisée partout où n'importe quelle autre valeur peut être utilisée—il y a peu ou pas de restrictions.

Les fonctions comme valeurs. En JavaScript, les fonctions peuvent être assignées à des variables, passées en arguments à d'autres fonctions, retournées par des fonctions et stockées dans des structures de données. Cette flexibilité permet des techniques de programmation fonctionnelle. Par exemple :

  • Assigner une fonction à une variable : var square = function(x) { return x * x; }
  • Passer une fonction en argument : [1, 2, 3].map(function(x) { return x * 2; })
  • Retourner une fonction : function makeAdder(x) { return function(y) { return x + y; }; }

Cette nature de première classe des fonctions est la base de nombreux modèles de programmation fonctionnelle en JavaScript.

2. Les fonctions d'ordre supérieur sont essentielles à la programmation fonctionnelle en JavaScript

Les fonctions d'ordre supérieur qui capturent d'autres fonctions sont une technique très puissante pour construire des abstractions.

Abstractions puissantes. Les fonctions d'ordre supérieur prennent soit des fonctions en arguments, soit retournent des fonctions en résultats. Elles permettent des abstractions puissantes et la réutilisation du code. Des exemples courants incluent :

  • map : Transformer chaque élément d'une collection
  • reduce : Combiner les éléments d'une collection en une seule valeur
  • filter : Sélectionner des éléments d'une collection en fonction d'un prédicat

Ces fonctions vous permettent d'exprimer des opérations complexes de manière succincte et de composer des comportements. Par exemple :

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

Ce code exprime clairement l'intention de sélectionner les nombres pairs et de les élever au carré, sans gérer explicitement les boucles ou les tableaux intermédiaires.

3. Les fermetures permettent des techniques fonctionnelles puissantes en JavaScript

Une fermeture est une fonction qui capture les liaisons externes (c'est-à-dire, pas ses propres arguments) contenues dans la portée dans laquelle elle a été définie pour une utilisation ultérieure (même après que cette portée soit terminée).

Encapsulation et état. Les fermetures permettent aux fonctions de "se souvenir" et d'accéder aux variables de leur portée externe, même après que cette portée ait fini d'exécuter. Cela permet :

  • État privé : Créer des variables accessibles uniquement par des fonctions spécifiques
  • Usines de fonctions : Générer des fonctions spécialisées basées sur des paramètres
  • Application partielle : Créer de nouvelles fonctions en fixant certains arguments de fonctions existantes

Exemple d'une fermeture maintenant un état privé :

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

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

La variable count n'est pas directement accessible, mais la fonction retournée peut y accéder et la modifier.

4. La composition de fonctions permet de construire des comportements complexes à partir de parties simples

La programmation fonctionnelle consiste à démonter les programmes et à les réassembler à partir des mêmes parties, abstraites derrière des frontières de fonctions.

Construire la complexité. La composition de fonctions est le processus de combinaison de deux ou plusieurs fonctions pour créer une nouvelle fonction. Cela vous permet de :

  • Créer des comportements complexes à partir de parties simples et réutilisables
  • Améliorer la lisibilité du code en décomposant des opérations complexes
  • Améliorer la maintenabilité en isolant et en testant des unités de fonctionnalité plus petites

La composition peut être réalisée de différentes manières :

  • Composition manuelle : const f = x => h(g(x))
  • Fonctions utilitaires : const compose = (f, g) => x => f(g(x))
  • Bibliothèques comme Ramda ou Lodash/FP

Exemple de construction d'un pipeline de traitement de données par composition :

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

Cela exprime clairement les étapes du traitement des données sans encombrer le code avec des détails d'implémentation.

5. Les fonctions pures et l'immutabilité conduisent à un code plus prévisible

Programmer avec des fonctions pures peut sembler incroyablement limitant. [...] Cependant, lorsque vous adoptez une vision libertaire de la mutation d'état, vous limitez en fait vos possibilités de composition, compliquez votre capacité à raisonner sur les effets de toute déclaration donnée et rendez plus difficile le test de votre code.

Prédictibilité et testabilité. Les fonctions pures produisent toujours la même sortie pour des entrées données et n'ont pas d'effets secondaires. Cela, combiné avec des données immuables :

  • Simplifie le raisonnement sur le comportement du code
  • Facilite les tests et le débogage
  • Permet une parallélisation et une mémoïsation sûres

Stratégies pour maintenir la pureté et l'immutabilité :

  • Utiliser const pour les variables qui ne doivent pas changer
  • Créer de nouveaux objets/tableaux au lieu de modifier ceux existants
  • Utiliser des bibliothèques comme Immutable.js pour des structures de données immuables efficaces

Exemple d'une fonction pure :

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

Cette fonction ne modifie pas le panier original, ce qui facilite le suivi des changements et la prédiction du comportement.

6. La récursion offre une alternative aux boucles en programmation fonctionnelle

En utilisant la récursion, l'état est géré via les arguments de la fonction, et le changement est modélisé via les arguments d'un appel récursif à l'autre.

Solutions élégantes. La récursion conduit souvent à des solutions plus élégantes et concises pour les problèmes impliquant des structures hiérarchiques ou répétitives. Les avantages incluent :

  • Expression naturelle de certains algorithmes (par exemple, parcours d'arbre)
  • Évitement de l'état mutable souvent associé aux boucles
  • Potentiel pour des optimisations par le compilateur (optimisation des appels en queue)

Cependant, soyez conscient des risques de débordement de pile en JavaScript, qui manque d'optimisation des appels en queue dans la plupart des environnements. Les techniques pour atténuer cela incluent :

  • Trampolining : Envelopper les appels récursifs dans des thunks
  • Style de passage de continuation : Gérer explicitement la pile d'appels

Exemple d'une fonction récursive pour aplatir un tableau imbriqué :

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

7. La programmation fonctionnelle facilite les flux de données et les pipelines de transformation

Les pipelines sont censés être purs—aucune donnée n'a été endommagée en les traversant.

Transformations de données claires. La programmation fonctionnelle encourage à penser en termes de données circulant à travers une série de transformations. Cette approche :

  • Améliore la lisibilité du code en montrant clairement les étapes du traitement des données
  • Améliore la maintenabilité en séparant les préoccupations
  • Facilite la parallélisation et l'optimisation

Techniques pour construire des pipelines :

  • Chaînage de méthodes (par exemple, avec lodash)
  • Composition de fonctions pures
  • Bibliothèques spécialisées comme RxJS pour les flux de données asynchrones

Exemple d'un pipeline de traitement de commandes :

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

Cela montre clairement les étapes impliquées dans le traitement des commandes sans s'enliser dans les détails d'implémentation.

8. La conception basée sur les mixins offre une approche fonctionnelle de la composition d'objets

Les données simples sont les meilleures. Les types de données spécialisés devraient être, eh bien, spéciaux.

Composition flexible. Les mixins fournissent un moyen de composer le comportement des objets sans s'appuyer sur l'héritage classique. Cette approche :

  • Permet une conception de code plus flexible et modulaire
  • Évite les problèmes associés aux hiérarchies d'héritage profondes
  • Facilite un style de programmation orienté objet plus fonctionnel

Implémentation des mixins en JavaScript :

  • Utiliser Object.assign() pour copier des méthodes sur les prototypes d'objets
  • Employer des fonctions d'ordre supérieur pour créer des fonctions usines qui appliquent des mixins

Exemple de création d'un objet avec des mixins :

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

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

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

Cette approche permet une composition flexible du comportement des objets sans hiérarchies de classes rigides.

Dernière mise à jour:

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.

Avis

4.07 sur 5
Moyenne de 100+ évaluations de Goodreads et Amazon.

Functional JavaScript reçoit majoritairement des avis positifs, avec une note moyenne de 4,07 sur 5. Les lecteurs apprécient sa clarté dans l'explication des concepts de programmation fonctionnelle en JavaScript, louant son approche directe et ses exemples pratiques. Beaucoup le trouvent révélateur et précieux pour améliorer leurs compétences en codage. Certains critiques soulignent sa densité et le recommandent aux programmeurs de niveau intermédiaire à avancé. Bien que quelques-uns critiquent sa dépendance à Underscore.js et remettent en question son applicabilité dans le monde réel, la plupart s'accordent à dire que c'est une introduction solide aux techniques de programmation fonctionnelle en JavaScript.

À propos de l'auteur

Michael Fogus est un développeur logiciel expérimenté et auteur reconnu pour son expertise en programmation fonctionnelle. Il a écrit plusieurs livres sur la programmation, dont "The Joy of Clojure" et "Functional JavaScript". Fogus est respecté pour sa capacité à expliquer des concepts complexes de manière claire et concise. Son travail se concentre souvent sur l'application des principes de la programmation fonctionnelle à divers langages, en particulier JavaScript. Fogus est également connu pour ses contributions à la communauté Clojure et son implication dans le développement de langages de programmation. Son style d'écriture est loué pour sa simplicité et son caractère éclairant, rendant des sujets difficiles accessibles aux lecteurs de différents niveaux d'expérience.

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 →