HOWTO · JavaScript
Fonctions imbriquées en JavaScript
Ce didacticiel présente les fonctions imbriquées en JavaScript.
Sur cette page
Une fonction imbriquée est une fonction définie à l’intérieur d’une autre fonction. La fonction externe détermine où la fonction interne est accessible, et cette dernière peut lire les variables de la portée dans laquelle elle a été créée. Ce guide explique comment définir et appeler une fonction imbriquée, pourquoi l’accès aux variables externes peut être utile et comment garder ce modèle lisible.
Que sont les fonctions imbriquées ?
En JavaScript, une fonction interne peut utiliser les paramètres et les variables locales de sa fonction externe. Si elle reste accessible après le retour de la fonction externe, elle conserve l’accès aux variables auxquelles elle fait référence. La combinaison d’une fonction et de cet accès lexical préservé constitue une fermeture lexicale.
Exécutez cet exemple :
function makeAdder(amount) {
return function add(value) {
return amount + value;
};
}
const addFive = makeAdder(5);
console.log(addFive(10));
15
Le résultat d’exécution fourni est 15. makeAdder(5) renvoie la fonction interne, qui est ensuite appelée avec 10 ; elle lit amount dans la portée lexicale de l’appel externe. Renvoyer une fonction interne est un modèle courant de fermeture lexicale. Il ne s’agit pas automatiquement de currying : le currying transforme précisément une fonction qui accepte plusieurs arguments en une suite de fonctions qui en acceptent chacune un seul.
Avantages des fonctions imbriquées
Une fonction imbriquée garde un utilitaire près du code qui l’utilise et évite d’ajouter un nom à la portée environnante. Une fonction interne renvoyée peut aussi conserver un état privé entre plusieurs appels. Par exemple, une fabrique de compteurs peut créer une variable locale count et renvoyer une fonction qui la met à jour. Chaque appel à la fabrique crée sa propre liaison, ce qui permet à plusieurs compteurs de conserver des états distincts. Ce comportement est rendu possible par les fermetures lexicales ; elles ne garantissent pas une exécution plus rapide.
Une fonction interne peut accéder aux variables externes, mais cela ne fait pas de chaque callback une fonction imbriquée. Un callback défini ailleurs puis transmis à une fonction est un callback passé à une fonction d’ordre supérieur ; il n’est imbriqué que si sa définition se trouve à l’intérieur d’une autre fonction.
Quand utiliser des fonctions imbriquées
Utilisez une fonction imbriquée lorsqu’elle a besoin des valeurs ou de la portée de sa fonction externe, lorsqu’un utilitaire n’a de sens qu’à cet endroit, ou lorsque vous souhaitez créer une fonction configurée avec une valeur, comme un multiplicateur. Renvoyer cette fonction configurée permet aux appelants de réutiliser le réglage sans devoir le transmettre à chaque appel.
Si l’utilitaire n’a besoin ni des variables ni de la portée de la fonction externe, le définir dans une portée plus large peut faciliter sa réutilisation et ses tests. Choisissez l’imbrication lorsqu’elle exprime clairement une relation ou permet de conserver un état, et non simplement parce qu’une fonction peut être placée dans une autre.
Bonnes pratiques pour les fonctions imbriquées
Donnez à chaque fonction un rôle précis et choisissez des noms qui expliquent le lien entre la configuration externe et l’action interne. Évitez les niveaux d’imbrication qui rendent le déroulement du code difficile à suivre ; extrayez un utilitaire lorsqu’il peut exister indépendamment ou que la fonction qui le contient devient difficile à parcourir.
Une fermeture lexicale conserve l’accès à son environnement lexical tant qu’elle reste accessible. C’est un comportement normal, qui ne justifie pas d’éviter systématiquement les fermetures lexicales. Dans du code à longue durée de vie, évitez de garder une fermeture accessible plus longtemps que nécessaire si elle maintient aussi de gros objets accessibles.
Conclusion
Une fonction imbriquée est définie à l’intérieur d’une autre fonction et peut utiliser les variables de celle-ci grâce à la portée lexicale. Lorsqu’elle est renvoyée, elle peut préserver cet accès sous forme de fermeture lexicale, ce qui permet de conserver un état privé et de réutiliser une configuration. Utilisez ce modèle lorsque cette relation clarifie le code et réduisez l’imbrication lorsqu’elle complique la logique.
FAQ
- Que sont les fonctions imbriquées en JavaScript ? Une fonction imbriquée est définie à l’intérieur d’une autre fonction et peut accéder aux variables de sa portée lexicale externe.
- Pourquoi utiliser des fonctions imbriquées ? Elles permettent de garder des utilitaires locaux, de conserver un état dans une fermeture lexicale ou de créer des fonctions configurées avec une valeur externe. Elles n’améliorent pas intrinsèquement les performances.
- Les fonctions imbriquées peuvent-elles accéder aux variables de la fonction externe ? Oui. Une fonction interne peut lire les variables de sa portée lexicale, même après le retour de la fonction externe si elle reste accessible.
- Quel est l’inconvénient des fonctions imbriquées ? Une imbrication excessive peut rendre le code plus difficile à lire et à maintenir.
- Comment bien utiliser les fonctions imbriquées ? Gardez-les centrées sur un rôle précis, donnez-leur des noms clairs et définissez un utilitaire dans une portée plus large lorsqu’il n’a pas besoin de la portée qui l’englobe.