Avancé20 min de lecture

Fonctions fléchées

Apprends la syntaxe concise des fonctions fléchées, comprends les retours implicites, et sache quand utiliser les fonctions fléchées plutôt que les fonctions régulières.

Syntaxe des fonctions fléchées

Les fonctions fléchées offrent une syntaxe plus courte pour écrire des expressions de fonction. Elles ont été introduites avec ES6 et sont maintenant l'une des fonctionnalités les plus utilisées en JavaScript moderne.

Syntaxe de base — paramètres entre parenthèses, flèche, puis un corps de bloc :

javascript
const greet = (name) => {
  return 'Hello, ' + name + '!';
};

Corps concis — si le corps de la fonction est une seule expression, tu peux omettre les accolades et le mot-clé return. L'expression est retournée implicitement :

javascript
const double = (x) => x * 2;

Paramètre unique — les parenthèses sont optionnelles quand il y a exactement un paramètre :

javascript
const double = x => x * 2;

Aucun paramètre — utilise des parenthèses vides :

javascript
const sayHello = () => 'Hello!';

Plusieurs paramètres — les parenthèses sont obligatoires :

javascript
const add = (a, b) => a + b;

Les fonctions fléchées sont particulièrement élégantes pour les callbacks courts :

javascript
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map(n => n * 2);
console.log(doubled); // [2, 4, 6, 8, 10]

Retour implicite vs explicite

Comprendre quand une valeur est retournée est crucial avec les fonctions fléchées.

Corps concis (retour implicite) : Quand tu omets les accolades, l'expression unique est automatiquement retournée :

javascript
const square = x => x * x;
console.log(square(5)); // 25

Corps de bloc (retour explicite) : Quand tu utilises des accolades, tu dois utiliser le mot-clé return explicitement :

javascript
const square = x => {
  return x * x;
};

Une erreur courante est d'utiliser des accolades sans return :

javascript
const square = x => { x * x }; // Retourne undefined !

Retourner un objet littéral : Puisque les accolades sont utilisées pour le corps de la fonction, retourner un objet littéral nécessite de l'envelopper entre parenthèses :

javascript
// Incorrect — JS pense que {} est le corps de la fonction
const getUser = () => { name: 'Alice' }; // Retourne undefined

// Correct — les parenthèses indiquent à JS que c'est une expression
const getUser = () => ({ name: 'Alice' });
console.log(getUser()); // { name: 'Alice' }

Pour les expressions multilignes, tu peux envelopper l'expression entière entre parenthèses :

javascript
const getFullName = (first, last) => (
  first + ' ' + last
);

Fonctions fléchées et `this`

La différence comportementale la plus importante entre les fonctions fléchées et les fonctions régulières est la façon dont elles gèrent le mot-clé this.

Les fonctions fléchées n'ont pas leur propre this. Elles héritent de this depuis la portée lexicale englobante (le code qui les entoure).

Cela rend les fonctions fléchées idéales pour les callbacks :

javascript
const timer = {
  seconds: 0,
  start() {
    // La fonction fléchée hérite de 'this' depuis start()
    setInterval(() => {
      this.seconds++; // 'this' fait correctement référence à timer
      console.log(this.seconds);
    }, 1000);
  }
};

Avec une fonction régulière, this ferait référence à l'objet global (ou undefined en mode strict), pas à l'objet timer.

N'utilise PAS les fonctions fléchées comme méthodes d'objet :

javascript
const person = {
  name: 'Alice',
  // Mauvais — fonction fléchée : 'this' n'est PAS l'objet person
  greet: () => console.log('Hi, ' + this.name), // undefined

  // Bon — syntaxe de méthode régulière raccourcie
  greet() { console.log('Hi, ' + this.name); }  // 'Hi, Alice'
};

Autres limitations :

  • Les fonctions fléchées ne peuvent pas être utilisées comme constructeurs (pas de mot-clé new).
  • Les fonctions fléchées n'ont pas d'objet arguments. Utilise les paramètres rest (...args) à la place.

Conversion en fonctions fléchées

html
<div id="output"></div>

<script>
  // Regular function
  // function add(a, b) { return a + b; }

  // Arrow function equivalent
  const add = (a, b) => a + b;

  // Regular function expression
  // const isEven = function(n) { return n % 2 === 0; };

  // Arrow function equivalent
  const isEven = n => n % 2 === 0;

  // Using arrow functions with array methods
  const numbers = [1, 2, 3, 4, 5, 6, 7, 8];
  const evens = numbers.filter(n => n % 2 === 0);
  const doubled = numbers.map(n => n * 2);
  const sum = numbers.reduce((acc, n) => acc + n, 0);

  const output = document.getElementById('output');
  output.innerHTML = `
    <p>add(3, 5): ${add(3, 5)}</p>
    <p>isEven(4): ${isEven(4)}</p>
    <p>isEven(7): ${isEven(7)}</p>
    <p>Evens: [${evens}]</p>
    <p>Doubled: [${doubled}]</p>
    <p>Sum: ${sum}</p>
  `;
</script>

Que retourne `const add = (a, b) => a + b; add(2, 3)` ?

Prêt à pratiquer ?

Crée ton compte gratuit pour accéder à l'éditeur de code interactif, lancer les défis et suivre ta progression.