Maison > interface Web > js tutoriel > le corps du texte

Explication détaillée de l'utilisation des fermetures js

php中世界最好的语言
Libérer: 2018-04-28 11:56:39
original
1667 Les gens l'ont consulté

Cette fois, je vous apporte une explication détaillée de l'utilisation des fermetures js. Quelles sont les précautions lors de l'utilisation des fermetures js. Voici des cas pratiques, jetons un coup d'œil.

la fermeture est la combinaison d'une fonction et de l'environnement lexical dans lequel cette fonction a été déclarée >

En termes simples, fermeture = fonction + environnement

Le premier. exemple de fermeture

En fait, cette châtaigne est très simple, displayName() est la fonction de fermeture à l'intérieur de init(), et pourquoi le nom de variable défini en externe peut-il être appelé à l'intérieur de displayName Parce que ? la jsfonction interne

a la permission d'obtenir les variables dans la fonction externe.
function init() {
 var name = 'Mozilla'; // name is a local variable created by init
 function displayName() { // displayName() is the inner function, a closure
 alert(name); // use variable declared in the parent function 
 }
 displayName(); 
}
init();
because inner functions have access to the variables of outer functions, displayName() can access the variable name declared in the parent function, init().
Copier après la connexion

Deuxième exemple

L'exemple ci-dessus peut-il afficher correctement 10 11 12 ?

var data = [
 {'key':0},
 {'key':1},
 {'key':2}
];
function showKey() {
 for(var i=0;i<data.length;i++) {
   setTimeout(function(){
    //console.log(i); //发现i输出了3次3
   //console.log(this); // 发现 this 指向的是 Window
   data[i].key = data[i].key + 10;
   console.log(data[i].key)
   }, 1000);
 }
}
showKey();
Copier après la connexion

La réponse est : Non, et il signalera également une erreur de syntaxe....

console.log(i); sortie 3 fois 3. En d'autres termes, après setTimeout 1000 millisecondes, lorsque la fonction de fermeture est exécutée, la boucle for est terminée et i est une valeur fixe, ce qui n'obtient pas l'effet attendu.

console.log(this); a constaté que cela pointe vers Window, c'est-à-dire que la fonction de fermeture implémentée à l'intérieur de la fonction a été convertie en une fonction globale et stockée en mémoire.

Vous devez donc définir une autre fonction d'exécution

Je pense que vous maîtrisez la méthode après avoir lu le cas dans cet article. Pour des informations plus intéressantes, veuillez prêter attention aux autres articles connexes. sur le site PHP chinois !

Lecture recommandée :
var data = [
 {'key':0},
 {'key':1},
 {'key':2}
];
function showKey() {
 var f1 = function(n){
  data[i].key = data[i].key + 10;
  console.log(data[i].key)
 }
 for(var i=0;i<data.length;i++) {
   setTimeout(f1(i), 1000);
 }
}
showKey();
// 得到预期的 10 11 12
Copier après la connexion

Explication détaillée de l'utilisation des composants dynamiques personnalisés Vue

Explication détaillée des étapes d'utilisation du temps partagé fonctions en js

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal