Récemment, je lisais l'Introduction aux normes ES du professeur Ruan Yifeng, et quand j'ai lu le premier chapitre, j'ai mentionné un morceau de code
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
Utiliser let ici peut résoudre ce problème, mais que se passe-t-il si nous utilisons la méthode ES5 ? IIFE peut le faire, mais il l'imprime immédiatement.
Problème de fermeture
Vous pouvez utiliser des attributs personnalisés
var a = [];
for (var i = 0; i < 10; i++) {
}
a[6](); // 6
Cela n'a rien à voir avec quoi que ce soit. Je pense que la personne qui pose la question veut afficher 6, n'est-ce pas ?
Mais la question que vous avez posée ne semble absolument pas pertinente par rapport à ce que vous voulez. Je veux vous aider à modifier la description de la question mais je suis un peu impuissant...let
est 10, donc 10 est la sortie.
Quant à ce que l'interrogateur a dit,for
里面的i
的作用于是整个外部区域,所以,当调用a[6]()
的时候,其实运行的是console.log(i)
,而此时因为跑完循环,i
peut être résolu car les variables déclarées par
let
可以解决,是因为,for
里面,let
声明的变量,作用于只在for
内部,所以,不会因为循环跑完而使得i
dansfor
ne fonctionnent qu'à l'intérieur defor
, elles ne s'exécuteront donc pas à cause des boucles.i
égal à 10 dans la portée globale.En fait, ce que cette question examine réellement devrait être la clôture.
Le rôle de la fermeture est similaire au rôle précédent de
let
, qui est d'isoler les variables locales les unes des autres sans contaminer les valeurs des variables externes. Chaque fermeture est une zone indépendante, et les paramètres de fermeture ne sont utilisés qu'à l'intérieur de la fermeture, donc. le résultat de la sortie 6 peut également être obtenu.Vous pouvez utiliser des fermetures
http://www.softwhy.com/articl...
La seconde moitié de cet article a déjà expliqué vos questions