function box() {
var arr = [];
for (var i = 0; i < 5; i++) {
arr[i] = function () {
return i;
}
}
return arr;
}
var b = box();
for (var i = 0; i < 5; i++) {
alert(b[i]);
}
Après l'exécution de box(), pourquoi les valeursde arr[0] à arr[4] sont-elles toutes fonction () { return i;}
Pourquoi ne le sont-elles pas : function () {return 0;}, fonction () {retour 1;}. . .
Étant donné que la fermeture ne peut obtenir que la dernière valeur de n'importe quelle variable de la fonction, qui fait ici référence à la variable i, la fonction box() renvoie un tableau de fonctions après exécution, et chaque i du tableau fait référence à la même variable A i. . Notez que box() renvoie une fonction ! Donc {return i} inside n'est qu'une instruction dans la fonction et n'a pas encore été exécutée, donc bien sûr {return i} reste inchangé. Parce qu'il fait référence au même i externe, lorsque la fonction box() renvoie, la valeur de la variable externe i est 5. À ce stade, chaque retour fait référence au même objet variable qui enregistre la variable i, donc si l'interne fonction dans arr[], la valeur de i à l'intérieur de chaque fonction est 5.
Parce que la chaîne de portée associée à la fermeture est "en direct" Et ils partagent la variable i , plutôt que d'attribuer sa propre copie distincte de la valeur de chaque variable liée. Ils référencent simplement i, la valeur de i. à chaque étape ne sera pas sauvegardé
.Livre de référence : Le guide définitif de JavaScript Section 8.6.
La fonction dans la boucle for dans l'exemple est uniquement attribuée, non exécutée, donc la valeur de i est obtenue lorsque la fonction dans le tableau est exécutée. À ce stade, i n'a que la valeur à la fin de la boucle. la fermeture est utilisée à l'étage, juste un immédiat La fonction anonyme exécutée obtient la valeur de i pour chaque boucle
Méthode : 1. Utilisez ES6 let pour remplacer var
function box() {
2. Utilisez la fermeture
function box() {
. Le mot « fermeture » vient de la combinaison d'un bloc de code à exécuter (car les variables libres sont contenues à l'intérieur du bloc, ces variables libres et les objets auxquels elles font référence ne sont pas libérées) et de la liaison prévue pour les variables libres. Environnement informatique (portée) --- Encyclopédie Baidu
signifie
Il s'agit d'un bloc de code. Sa fonction est uniquement de référencer i, de sorte que le fait de maintenir i empêchera que i soit libéré. Avant que ce bloc de code ne soit exécuté, il ne sait pas que i est Any. c'est vrai, il ne recherchera i que lorsqu'il est en cours d'exécution, vous pouvez donc afficher tous vos arr, et toute la sortie devrait être 5
est calculé uniquement lorsque
i
est appelé.Lors de l'appel de ces fonctions,
for
est terminé, donc la valeur lors de la prise defor
已经结束,因此取i
的时候值是5
est5