javascript - Je suis nouveau dans l'apprentissage des fermetures et je ne comprends pas très bien. Veuillez me donner quelques conseils.
大家讲道理
大家讲道理 2017-06-26 10:58:00
0
7
690
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 valeurs​​de arr[0] à arr[4] sont-elles toutes fonction () { return i;}
Pourquoi ne le sont-elles pas : function () {return 0;}, fonction () {retour 1;}. . .

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

répondre à tous(7)
学习ing

É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]
伊谢尔伦

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.

淡淡烟草味
function box() {
    var arr = [];
    for (var i = 0; i < 5; i++) {
        arr[i] = function () {
            return i;
        }();
    };
    return arr;
}

这样就是了
世界只因有你
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]);
 }
阿神

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]());
}
我想大声告诉你

. 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

我想大声告诉你
// 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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal