portée de fermeture js
扔个三星炸死你
扔个三星炸死你 2017-06-28 09:28:39
0
8
766

Pourquoi est-il émis 10 fois ? Le 10 inséré ne devrait-il pas être compris entre 1 et 9 ? Veuillez me donner une réponse à cet écueil 

function save_i(){
    var a = [];
    for(var i = 0;i<10;i++){
        a[i] = function(){
            return i;
        }
    }
    return a;   
}

var c = save_i();
for(var i = 0;i<10;i++){
   console.log(c[i]());
    //10次 10
}
扔个三星炸死你
扔个三星炸死你

répondre à tous(8)
黄舟

Il vous suffit de créer une fonction de fermeture pour enregistrer la valeur i lorsque la boucle for est exécutée, et elle peut être sortie dans l'ordre

function save_i(){
    var a = [];
    for(var i = 0;i<10;i++){
        a[i] = function(i){
            return function() {
                return i;
            };
        }(i);
    }
    return a;
}

var c = save_i();
for(var i = 0;i<10;i++){
   console.log(c[i]());
    //已经变为依次输出
}
阿神
在执行点击事件之前,for循环已经执行完,也就是最终获取的是最后 i 的值5。  
呆神:绑定 和 点击 是两个事件  点击是用户交互的时候发生  绑定在引擎编译代码的时候就发生了~             
宇神:这样理解吧,你把点击事件当做一个下车事件,而火车从1-4,到4时你才能下车执行事件,此时值为4.

Articles que j'ai lus dans le passé
Comprendre les fermetures nécessite que vous ayez écrit un code et que vous puissiez ensuite l'utiliser dans votre propre code. À part cela, vous ne pouvez le mémoriser que par cœur.
Les Chinois de la vieille école aiment laisser leurs enfants porter des choses quand ils sont très jeunes, mais ils ne savent pas ce que cela signifie et parfois ils ne peuvent pas l'expliquer clairement. Ils espèrent qu'ils le comprendront naturellement à un moment donné. futur
Ce qui précède
Si vous avez certaines connaissances de base. Il est recommandé de lire les journaux que j'ai écrits. Si vous ne comprenez toujours pas, laissez un message et demandez-moi
http://user.qzone.qq. .com/2084...

女神的闺蜜爱上我
function save_i(){
    var a = [];
    for(var i = 0;i<10;i++){
        a[i] = function(i){
            return i;
        };
    }
    return a;   
}

var c = save_i();
for(var i = 0;i<10;i++){
   console.log(c[i](i));
}
黄舟
 a[i] = function(i){
            return i;
        };

Chaque i en retour fait référence au même i externe, qui vaut 10

黄舟
var fns=[];
function test(){
    for(var i=0;i<10;i++){
        (function(j){
            fns.push(
                function(){
                    console.log(j);
                }
            );
    })(i);    
    
    }

}

test();

for(var k=0;k<fns.length;k++){
    fns[k]();
}

La portée des variables var est la portée de la fonction, pas la portée au niveau du bloc

Peter_Zhu

La chaîne de portées a été générée lors de sa création. c[i] = function(i){ return i; };Lors de l'exécution, la portée actuelle n'a pas de i et le i de la portée supérieure save_i() est devenu 10. Pensez-vous que le résultat est 0~9 ? Pensez-vous que la portée supérieure est la portée globale ?

黄舟

a[i] est un ensemble de fonctions lorsqu'elles sont assignées, c'est-à-dire qu'il n'est pas exécuté, il n'obtient pas non plus i, et sa portée ne comprend pas non plus i

Lorsque vous l'exécutez ci-dessous, ce groupe de fonctions commence à rechercher le i qui peut être obtenu dans leur propre portée, qui est le 10 après l'exécution de la boucle

巴扎黑

Le mot-clé

var déclare que la portée de la variable est la portée de la fonction, donc la variable i dans la boucle for sera promue. Tout ira bien si l'affiche modifie la section de la boucle for en une fonction auto-exécutable. par exemple :
fonction save_i(){

var a = [],
    i = 0;
for(;i<10;i++){
    a[i] = function(i){
        return i;
    }(i);
}
return a;

}

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