Fermeture JavaScript
- Page précédente Liage de fonction JS
- Page suivante Introduction aux classes JS
Les variables JavaScript appartiennent àlocal
ouGlobal
portée.
Les variables globales peuvent être accessibles parFermeture
réaliser un local (privé).
Variable globale
Une fonction peut accéder à une fonctionInternesDéfinies par une fonction, par exemple :
Exemple
function myFunction() { var a = 4; return a * a; }
Mais une fonction peut également accéder aux variables définies par elle-mêmeExterneDéfinies comme des variables, par exemple :
Exemple
var a = 4; function myFunction() { return a * a; }
Dans le dernier exemple,a
estGlobalVariable.
Dans une page web, les variables globales appartiennent à l'objet window.
Les variables globales peuvent être utilisées et modifiées par tous les scripts de la page (et de la fenêtre).
Dans le premier exemple,a
estLocaleVariable.
Les variables locales ne peuvent être utilisées que dans la fonction où elles sont définies. Elles sont invisibles pour d'autres fonctions et scripts.
Les variables globales et locales portant le même nom sont des variables différentes. La modification d'une ne change pas l'autre.
sansmot-clé var
Les variables créées sont toujours globales, même si elles sont créées dans une fonction.
Cycle de vie des variables
Les variables globales vivent aussi longtemps que votre application (fenêtre, page web).
Les variables locales n'ont pas une longue durée de vie. Elles sont créées lors de l'appel d'une fonction et supprimées après la fin de la fonction.
Un dilemme de compteur
Supposons que vous souhaitez utiliser une variable pour compter, et que vous souhaitez que ce compteur soit accessible à toutes les fonctions.
Vous pouvez utiliser des variables globales et des fonctions pour augmenter le compteur :
Exemple
// Initialisation du compteur var counter = 0; // Fonction d'augmentation du compteur function add() { counter += 1; } // Appel trois fois add() add(); add(); add(); // Le compteur devrait être 3
Ce modèle a un problème : n'importe quel code sur la page peut modifier le compteur sans appeler add().
Pour la fonction add(), le compteur devrait être local pour éviter que d'autres codes ne le changent :
Exemple
// Initialisation du compteur var counter = 0; // Fonction d'augmentation du compteur function add() { var counter = 0; counter += 1; } // Appel trois fois add() add(); add(); add(); // Le compteur devrait être 3. Mais c'est 0.
C'est inutile, car nous affichons le compteur global au lieu du compteur local.
En permettant à la fonction de renvoyer elle-même, nous pouvons supprimer le compteur global et accéder au compteur local :
Exemple
// Fonction d'augmentation du compteur function add() { var counter = 0; counter += 1; return counter; } // Appel trois fois add() add(); add(); add(); // Le compteur devrait être 3. Mais c'est 1.
C'est inutile, car nous réinitialisons le compteur local à chaque appel de fonction.
Les fonctions internes JavaScript peuvent résoudre ce problème.
Fonctions imbriquées JavaScript
Toutes les fonctions ont le droit d'accéder à la portée globale.
En réalité, en JavaScript, toutes les fonctions ont le droit d'accéder à leur propre portée supérieure.
JavaScript supporte les fonctions imbriquées. Les fonctions imbriquées peuvent accéder à leur propre portée.
Dans cet exemple, la fonction interne plus()
peut accéder aux variables de la fonction parente counter
Variable de comptage :
Exemple
function add() { var counter = 0; function plus() {counter += 1;} plus(); return counter; }
De cette manière, nous pouvons résoudre le dilemme du compteur, si nous pouvons accéder à l'extérieur plus()
Fonction.
Nous devons également trouver une fonction qui ne s'exécute qu'une fois counter = 0
Méthode.
Nous avons besoin de fermeture (closure).
Fermeture JavaScript
Souvenez-vous de la fonction auto-appelée ? Que fait cette fonction ?
Exemple
var add = (function () { var counter = 0; return function () {return counter += 1;} )) add(); add(); add(); // Le compteur est actuellement à 3
Explication de l'exemple
Variable add
L'attribution est la valeur de retour de la fonction auto-appelée.
Cette fonction auto-appelée ne s'exécute qu'une fois. Elle règle le compteur à zéro (0) et retourne l'expression de la fonction.
De cette manière, add est devenu une fonction. Le plus "spectaculaire" est qu'elle peut accéder au compteur de l'environnement parent.
C'est ce qu'on appelle JavaScript Fermeture. Il rend la fonction propriétaire de "PrivéIl est devenu possible pour une variable.
Le compteur est protégé par l'environnement de la fonction anonyme et ne peut être modifié que par la fonction add.
Un fermeture (closure) est une fonction qui a le droit d'accéder à l'environnement de la fonction parente, même après que la fonction parente ait fermé.
- Page précédente Liage de fonction JS
- Page suivante Introduction aux classes JS