Maison > Questions et réponses > le corps du texte
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;}. . .
学习ing2017-06-26 11:00:00
É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.
//执行内部返回的arr中的函数,当然box()[1]()、box()[2]()、box()[3]()...都返回5;
function box() {
var arr = [];
for (var i = 0; i < 5; i++) {
arr[i] = function () {
return i;
}
}
return arr;
}
box()[1](); //执行后返回5
//不执行内部函数,仅仅是box()的话,当然只返回一个function咯
function box() {
var arr = [];
for (var i = 0; i < 5; i++) {
arr[i] = function () {
return i;
}
}
return arr;
}
box(); //[function, function, function, function, function]
伊谢尔伦2017-06-26 11:00:00
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.
淡淡烟草味2017-06-26 11:00:00
function box() {
var arr = [];
for (var i = 0; i < 5; i++) {
arr[i] = function () {
return i;
}();
};
return arr;
}
这样就是了
世界只因有你2017-06-26 11:00:00
function box() {
var arr = [];
for (var i = 0; i < 5; i++) {
arr[i] = (function () {
return i;
})(i)
}
return arr;
}
var b = box();
for (var i = 0; i < 5; i++) {
alert(b[i]);
}
阿神2017-06-26 11:00:00
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() {
var arr = [];
for (let 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]());
}
2. Utilisez la fermeture
function box() {
var arr = [];
for (var i = 0; i < 5; i++) {
arr[i] = function (x) {
return function(){
return x;
};
}(i);
}
return arr;
}
var b = box();
for (var i = 0; i < 5; i++) {
alert(b[i]());
}
我想大声告诉你2017-06-26 11:00:00
. 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
function () {
return i;
}
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
我想大声告诉你2017-06-26 11:00:00
// arr的元素均是下面这个函数
function(){
return i;
}
Ce qu'est est calculé uniquement lorsque i
est appelé.
Lors de l'appel de ces fonctions, for
est terminé, donc la valeur lors de la prise de for
已经结束,因此取 i
的时候值是 5
est 5