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>