widness
2/23/2018 - 4:15 PM

Closure

Décris le fonctionnement des closures

<script>
function MaFonction(nombre) {
	function Ajouter(valeur) {
		// La variable "nombre" est accessible dans cette fonction, car "nombre"
		// a été définie en dehors de la fonction Ajouter
		return nombre + valeur;
	}

	// Comme on l'a vu, Ajouter est une variable, j'ai donc le droit de la rendre en
	// tant que résultat de la fonction
	return Ajouter;
}

//Ex: 
var a = MaFonction(10);
// La variable "a" contient désormais la fonction "Ajouter". "a" est désormais une
// fonction dans laquelle la variable "nombre" existe encore.

alert( a(2) ); // Affiche "12";

//Practice:
var a = ["elem1", "elem2", "elem3", "elem4", "elem5"];

for(var i = 0; i < 3; i++) {
	window.setTimeout(
		/* Argument 1 : Fonction à lancer après le délai */
		( function(arg1) {
			// "arg1" prendra la valeur de "i" lors d'un tour de boucle.
			// Cette valeur devient indépendante de "i" et n'est plus 
			// soumise au fonctionnement de la boucle
			
			// On retourne la fonction à exécuter à la fin du délai défini dans
			// "setTimeout"
			return function() {
				// Lorsque cette fonction s'exécutera, "arg1" contiendra
				// toujours la valeur qui lui a été transmise et n'aura pas
				// été modifié
				alert( a[arg1] );
			};
		} ) ( i ), // on passe en argument le compteur de la boucle
		/* Argument 2 : Délai en milisecondes avant de lancer la fonction */
		1000
	);
}

</script>