recherche

Maison  >  Questions et réponses  >  le corps du texte

javascript - Je suis nouveau dans l'apprentissage des fermetures et je ne comprends pas très bien. Veuillez me donner quelques conseils.

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;}. . .

大家讲道理大家讲道理2752 Il y a quelques jours694

répondre à tous(7)je répondrai

  • 学习ing

    学习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]
    

    répondre
    0
  • 伊谢尔伦

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

    répondre
    0
  • 淡淡烟草味

    淡淡烟草味2017-06-26 11:00:00

    function box() {
        var arr = [];
        for (var i = 0; i < 5; i++) {
            arr[i] = function () {
                return i;
            }();
        };
        return arr;
    }
    
    这样就是了

    répondre
    0
  • 世界只因有你

    世界只因有你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]);
     }

    répondre
    0
  • 阿神

    阿神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]());
    }

    répondre
    0
  • 我想大声告诉你

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

    répondre
    0
  • 我想大声告诉你

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

    répondre
    0
  • Annulerrépondre