02

Fonctions Avancées

Arrow functions, scope, closures, callbacks et fonctions d'ordre supérieur

← Accueil

1 Fonctions classiques vs Arrow Functions

// Fonction classique
function saluer(nom) {
  return "Bonjour " + nom;
}

// Arrow function — syntaxe courte
const saluer = (nom) => "Bonjour " + nom;

// Si un seul paramètre, pas besoin de parenthèses
const doubler = n => n * 2;

// Si plusieurs lignes, on garde les { } et le return
const calculer = (a, b) => {
  const somme = a + b;
  return somme * 2;
};
💡 Astuce : les arrow functions sont plus courtes et sont la norme moderne. Utilise-les par défaut.
Erreur fréquente :
const fn = () => { valeur: 42 };  // retourne undefined !
const fn = () => ({ valeur: 42 }); // ← entoure l'objet de ()

2 Scope (portée)

let global = "je suis partout";

function maFonction() {
  let local = "je suis seulement ici";
  console.log(global); // ✅ accessible
  console.log(local);  // ✅ accessible
}

console.log(global); // ✅
console.log(local);  // ❌ ReferenceError

Block scope avec let et const :

if (true) {
  let x = 10;     // scope = ce bloc {}
  const y = 20;
}
console.log(x);   // ❌ ReferenceError
Erreur fréquente avec var (raison de l'éviter) :
if (true) {
  var z = 30; // var ignore les blocs
}
console.log(z); // 30 ← surprise !

3 Closures

Une closure, c'est une fonction qui se souvient de son contexte de création.

function creerCompteur() {
  let count = 0; // variable "enfermée" dans la closure

  return function() {
    count++;
    return count;
  };
}

const compteur = creerCompteur();
console.log(compteur()); // 1
console.log(compteur()); // 2
console.log(compteur()); // 3
// count est protégée — personne ne peut y accéder directement
💡 Astuce : les closures servent à encapsuler des données privées.

4 Callbacks

Un callback = une fonction passée en argument à une autre fonction.

function faireCeci(action) {
  console.log("Avant...");
  action(); // ← on exécute le callback
  console.log("Après.");
}

faireCeci(() => console.log("Je suis le callback !"));
// Avant...
// Je suis le callback !
// Après.

Cas concret : setTimeout (tu verras plus en Module 05) :

setTimeout(() => console.log("3 secondes plus tard"), 3000);

5 Fonctions d'ordre supérieur

Une fonction qui prend une fonction en paramètre ou retourne une fonction.

// Prend une fonction
function appliquer(tableau, transformation) {
  const resultat = [];
  for (const item of tableau) {
    resultat.push(transformation(item));
  }
  return resultat;
}

const nombres = [1, 2, 3, 4];
const doubles = appliquer(nombres, n => n * 2);
console.log(doubles); // [2, 4, 6, 8]
C'est exactement ce que font map(), filter(), reduce() (Module 03).

6 Paramètres par défaut

function saluer(nom = "inconnu", lang = "fr") {
  if (lang === "fr") return `Bonjour ${nom}`;
  if (lang === "en") return `Hello ${nom}`;
}

saluer("Alice");        // "Bonjour Alice"
saluer("Bob", "en");    // "Hello Bob"
saluer();               // "Bonjour inconnu"

Résumé rapide

ConceptExemple court
Arrow fnconst f = x => x * 2
Scopelet et const sont block-scoped
Closurefonction qui retient sa variable locale
Callbackbtn.addEventListener('click', fn)
Ordre sup.appliquer(tab, fn)
🔧

Mini-Projet

Applique closures, callbacks et fonctions d'ordre supérieur dans un projet concret.

Exercices & Solutions

Télécharge les fichiers, ouvre-les dans ton éditeur et travaille directement dedans.

📝 exercices.js

4 exercices sur les arrow functions, closures, callbacks et la mémoïsation.

🟢 ×1 Facile 🟡 ×2 Moyen 🔴 ×1 Difficile
⬇ Télécharger
solutions.js

Corrections complètes. À consulter après avoir essayé.

Corrigé complet Best practices
⬇ Télécharger
🧠 Tester mes connaissances