Voici un cas qui pourrait vous surprendre :
1 2 3 4 5 6 7 8 9 10 11
| var variable = "globale";
function fonctionParente() {
var variable = "locale";
function fonctionFille() {
print(variable);
}
return fonctionFille;
}
var fille = fonctionParente();
fille(); |
fonctionParente
renvoie sa fonction interne et le code en bas de appelle cette fonction. Même si fonctionParente a fini de s’exécuter à ce moment-là, l’environnement local dans lequel variable a la valeur locale existe toujours, et fonctionFille continue de l’utiliser. Ce phénomène s’appelle une fermeture lexicale (ou closure en anglais).
La portée lexicale permet non seulement de rendre très facile et rapide à discerner dans quelle partie d’un programme une variable sera disponible, mais aussi de « synthétiser » des fonctions. En utilisant certaines des variables venant d’une fonction l’englobant, une fonction interne peut être amenée à faire des choses différentes. Imaginez que nous ayons besoin de plusieurs fonctions différentes mais similaires, l’une d’entre elles ajoutant 2 à son argument, l’autre ajoutant 5 et ainsi de suite.
1 2 3 4 5 6 7 8 9 10
| function creerFonctionAjouter(quantite) {
function ajouter(nombre) {
return nombre + quantite;
}
return ajouter;
}
var ajouterDeux = creerFonctionAjouter(2);
var ajouterCinq = creerFonctionAjouter(5);
show(ajouterDeux(1) + ajouterCinq(1)); |
Pour bien comprendre, vous ne devez pas considérer que les fonctions empaquettent seulement des calculs,
mais aussi un environnement. Les fonctions globales s’exécutent simplement dans l’environnement global, c’est assez évident. Mais une fonction définie à l’intérieur d’une autre fonction conserve l’accès à l’environnement existant dans cette fonction à l’instant où elle a été définie.
Par conséquent, la fonction ajouter de l’exemple au-dessus, qui est créée lorsque creerFonctionAjouter est appelée,
capture un environnement dans lequel quantite a une certaine valeur. Il empaquette cet environnement avec le calcul return nombre + quantite à l’intérieur d’une valeur qui est alors retournée depuis la fonction extérieure.
Lorsque cette fonction renvoyée (ajouterDeux ou ajouterCinq) est appelée,
un nouvel environnement ― dans lequel la variable nombre a une valeur ―
est créé comme un sous-environnement de l’environnement capturé (dans lequel quantite a une valeur). Ces deux valeurs sont ajoutées, et le résultat est renvoyé.
Au-delà du fait que différentes fonctions peuvent contenir des variables de même nom sans qu’elles ne se mélangent...
Partager