Maison  >  Article  >  interface Web  >  Comment les fonctions de fermeture JavaScript accèdent aux variables externes_conseils javascript

Comment les fonctions de fermeture JavaScript accèdent aux variables externes_conseils javascript

WBOY
WBOYoriginal
2016-05-16 16:38:272016parcourir

Une fermeture fait référence à une fonction qui a le droit d'accéder aux variables dans la portée d'une autre fonction. Cependant, il y a une chose à noter concernant le mécanisme de configuration de la portée, c'est-à-dire que la fermeture ne peut obtenir que la dernière valeur de n'importe quelle. variable dans la fonction contenant.

Comme le cas suivant :

function create(){
    var arr = new Array();  
 
    for (var i=0; i<10; i++){
        arr[i] = function(){
            return i;
        };  
    }
 
    return arr;
}
 
var c_arr = create();
 
for(var i=0; i<c_arr.length;i++){
    document.write("c_arr["+i+"] = "+c_arr[i]()+"<br />");    
}

Résultat de l'exécution :

Comment les fonctions de fermeture JavaScript accèdent aux variables externes_conseils javascript

En apparence, il semble que la valeur i renvoyée par chaque fonction soit différente. Par exemple, la valeur de c_arr[0] devrait être 0, la valeur de c_arr[1] devrait être 1, et ainsi de suite. En conséquence, chaque fonction renvoie 10. Pourquoi?

Étant donné que l'objet actif de la fonction create() est stocké dans la chaîne de portée de chaque fonction, ils font tous référence à la même variable i. Lorsque la boucle for se termine, la valeur de i devient 10. À ce stade, chaque fonction fait référence au même objet variable qui contient la variable i.

On peut forcer la fermeture à se comporter comme prévu en créant une autre fonction de nom de domaine afin que chaque position corresponde à la valeur correspondante.

function create(){
    var arr = new Array();  
 
    for (var i=0; i<10; i++){
        arr[i] = function(num){
            return function(){
                return num; 
            };
        }(i);   
    }
 
    return arr;
}
 
var c_arr = create();
 
for(var i=0; i<c_arr.length;i++){
    document.write("c_arr["+i+"] = "+c_arr[i]()+"<br />");    
}

Résultat de l'exécution :

Comment les fonctions de fermeture JavaScript accèdent aux variables externes_conseils javascript

Une fonction anonyme est définie et le mécanisme d'exécution de la fonction anonyme est immédiatement attribué au tableau. La fonction anonyme a ici un paramètre num, qui est la valeur à renvoyer par la fonction finale. Nous passons la variable i lors de l'appel de chaque fonction. Puisque les paramètres de fonction sont transmis par valeur, la valeur actuelle de la variable i sera affectée au paramètre num. À l'intérieur de cette fonction anonyme, une fermeture qui accède à num est créée et renvoyée. De cette façon, chaque fonction du tableau arr possède une copie de sa propre variable num, elle peut donc renvoyer des valeurs différentes.

Exemple classique

Regardons à nouveau un exemple classique. Supposons que la page comporte un ensemble de balises de bouton. Nous utilisons un script pour lier les événements de clic à cet ensemble de balises de bouton, et lorsque vous cliquez dessus, quel nombre de balises apparaîtront.

<meta charset="utf-8" />
 
<button>第一个</button>
<button>第二个</button>
<button>第三个</button>
<button>第四个</button>
 
 
<script type="text/javascript">
 
var obj = document.getElementsByTagName('button');
for(var i=0;i<obj.length;i++){
    obj[i].onclick = function(){
        alert(i);
    };  
}
 
</script>

Cliquez sur chaque bouton résultat

Comment les fonctions de fermeture JavaScript accèdent aux variables externes_conseils javascript

En apparence, il semble que cliquer sur chaque étiquette devrait faire apparaître un numéro différent

Le premier devrait apparaître avec 0 ;

Le deuxième devrait apparaître avec 1 ;

Et ainsi de suite.

Mais le résultat est que tous les boutons apparaissent 4, ce qui n'est évidemment pas le résultat que nous souhaitons.

Changeons de programme

<meta charset="utf-8" />
 
<button>第一个</button>
<button>第二个</button>
<button>第三个</button>
<button>第四个</button>
 
 
<script type="text/javascript">
 
var obj = document.getElementsByTagName('button');
for(var i=0;i<obj.length;i++){
    obj[i].onclick = function(num){
        return function(){
            alert(num);
        }       
    }(i);       
}
 
</script>

Cliquez sur le deuxième

Comment les fonctions de fermeture JavaScript accèdent aux variables externes_conseils javascript

Cliquez sur le quatrième

Comment les fonctions de fermeture JavaScript accèdent aux variables externes_conseils javascript

Il suffit de créer une fonction anonyme au sein de la fonction, comme dans le cas ci-dessus. Vous pouvez implémenter une fonction anonyme pour capturer la variable externe i. Par conséquent, la valeur i de chaque bombe bouton est différente.

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn