Maison interface Web js tutoriel Notes d'étude Javascript - Fonctions (3) : Fermetures et références_Connaissances de base

Notes d'étude Javascript - Fonctions (3) : Fermetures et références_Connaissances de base

May 16, 2016 pm 04:30 PM
javascript 引用 闭包

L'une des fonctionnalités les plus importantes de Javascript est l'utilisation de fermetures. En raison de l'utilisation de fermetures, la portée actuelle peut toujours accéder à des portées externes. Étant donné que Javascript n'a pas de portée au niveau du bloc, mais uniquement une portée de fonction, l'utilisation de fermetures est étroitement liée aux fonctions.

Variables privées simulées

Copier le code Le code est le suivant :

fonction Compteur(début) {
var count = début;
Retour {
incrément : fonction() {
Compte ;
},
          obtenir : function() {
              nombre de retours ;
>
>
>
var foo = Compteur(4);
foo.increment();
foo.get(); // 5

Ici, Counter renvoie deux fermetures : les fonctions incrémentent et obtiennent. Ces deux fonctions conservent l’accès à la portée Counter, elles peuvent donc toujours accéder au nombre de variables défini dans la portée Counter.

Comment fonctionnent les variables privées

Étant donné que Javascript ne peut pas attribuer de valeurs et faire référence à des étendues, dans l'exemple ci-dessus, il n'y a aucun moyen d'accéder directement au nombre de variables privées internes de l'extérieur. La seule façon d'y accéder est de définir une fermeture.

Copier le code Le code est le suivant :

var foo = nouveau compteur(4);
foo.hack = fonction() {
Nombre = 1337 ;
};

Le code ci-dessus ne modifiera pas la valeur de la variable count dans la portée du compteur car le hack n'est pas défini dans le compteur. Le code ci-dessus créera ou écrasera uniquement le nombre de variables globales.

Fermeture dans une boucle

L'une des erreurs les plus courantes consiste à utiliser des fermetures à l'intérieur des boucles.

Copier le code Le code est le suivant :

pour (var je = 0; je < 10; je ) {
setTimeout(fonction() {
console.log(i);
}, 1000);
>

Le code ci-dessus n'affichera pas 0 à 9, mais affichera 10 fois en continu.
L'anonymat ci-dessus conservera toujours une référence à la variable i. Lorsque la fonction console.log est appelée pour démarrer la sortie, la boucle est terminée et la variable i vaut déjà 10.
Afin d'éviter l'erreur ci-dessus, nous devons créer une copie de la variable i value à chaque fois dans la boucle.

Éviter les erreurs de citation

Afin de copier la valeur de la variable dans la boucle, le meilleur moyen est d'ajouter une fonction d'exécution immédiate anonyme dans la couche externe.

Copier le code Le code est le suivant :

pour (var je = 0; je < 10; je ) {
(fonction(e) {
​​​​ setTimeout(function() {
console.log(e);
}, 1000);
})(i);
>

Cette fonction anonyme externe reçoit la variable de boucle i comme premier paramètre et copie sa valeur dans son propre paramètre e.
La fonction anonyme externe transmet le paramètre e à setTimeout, donc setTimeout a une référence au paramètre e. Et la valeur de ce paramètre e ne changera pas en raison des changements de boucle externe.

Il existe une autre façon d'obtenir le même effet, qui consiste à renvoyer une fonction anonyme dans la fonction anonyme de setTimeout :

Copier le code Le code est le suivant :

pour (var je = 0; je < 10; je ) {
setTimeout((fonction(e) {
         return function() {
console.log(e);
>
})(i), 1000)
>

De plus, cela peut également être réalisé grâce à la méthode bind.

Copier le code Le code est le suivant :

pour (var je = 0; je < 10; je ) {
setTimeout(console.log.bind(console, i), 1000);
>

En fin d’article, résumons :

(1) La fermeture est un principe de conception qui simplifie les appels de l'utilisateur en analysant le contexte, permettant à l'utilisateur d'atteindre son objectif sans le savoir
 ; (2) Les articles grand public sur l'analyse des fermetures sur Internet sont en fait contraires au principe de fermeture. Si vous avez besoin de connaître les détails de la fermeture pour bien l'utiliser, la fermeture est un échec de conception
; (3) Étudiez le moins possible.

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

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quelle est la signification de la fermeture dans l'expression lambda C++ ? Quelle est la signification de la fermeture dans l'expression lambda C++ ? Apr 17, 2024 pm 06:15 PM

Quelle est la signification de la fermeture dans l'expression lambda C++ ?

Comment implémenter la fermeture dans une expression C++ Lambda ? Comment implémenter la fermeture dans une expression C++ Lambda ? Jun 01, 2024 pm 05:50 PM

Comment implémenter la fermeture dans une expression C++ Lambda ?

Quels sont les avantages et les inconvénients des fermetures dans les fonctions C++ ? Quels sont les avantages et les inconvénients des fermetures dans les fonctions C++ ? Apr 25, 2024 pm 01:33 PM

Quels sont les avantages et les inconvénients des fermetures dans les fonctions C++ ?

Quels sont les avantages des fonctions C++ renvoyant des types référence ? Quels sont les avantages des fonctions C++ renvoyant des types référence ? Apr 20, 2024 pm 09:12 PM

Quels sont les avantages des fonctions C++ renvoyant des types référence ?

L'impact des pointeurs de fonction et des fermetures sur les performances de Golang L'impact des pointeurs de fonction et des fermetures sur les performances de Golang Apr 15, 2024 am 10:36 AM

L'impact des pointeurs de fonction et des fermetures sur les performances de Golang

Comment utiliser la référence C++ et le passage de paramètres de pointeur ? Comment utiliser la référence C++ et le passage de paramètres de pointeur ? Apr 12, 2024 pm 10:21 PM

Comment utiliser la référence C++ et le passage de paramètres de pointeur ?

Analyse approfondie des pointeurs et des références en C++ pour optimiser l'utilisation de la mémoire Analyse approfondie des pointeurs et des références en C++ pour optimiser l'utilisation de la mémoire Jun 02, 2024 pm 07:50 PM

Analyse approfondie des pointeurs et des références en C++ pour optimiser l'utilisation de la mémoire

Comment les fermetures sont-elles implémentées en Java ? Comment les fermetures sont-elles implémentées en Java ? May 03, 2024 pm 12:48 PM

Comment les fermetures sont-elles implémentées en Java ?

See all articles