Maison interface Web js tutoriel Que sont les fermetures en Javascript

Que sont les fermetures en Javascript

Nov 20, 2017 pm 03:28 PM
javascript js 闭包

Qu'est-ce qu'une fermeture ?

Qu'est-ce qu'une fermeture ? Closure est Closure, qui est une nouvelle fonctionnalité que les langages statiques n'ont pas. Mais la fermeture n'est pas quelque chose de trop compliqué à comprendre.En bref, la fermeture est : la fermeture est l'ensemble des variables locales de la fonction, mais ces variables locales continueront d'exister après le retour de la fonction. La fermeture signifie que la "pile" d'une fonction n'est pas libérée après le retour de la fonction. On peut également comprendre que ces piles de fonctions ne sont pas allouées sur la pile mais sur le tas. Lorsqu'une autre fonction est définie au sein d'une fonction, une fermeture se produira. . Sac.

Fermeture = fonction créée à l'intérieur de la fonction (ou fonction interne en abrégé) + informations environnementales lors de la création de la fonction

La fermeture n'est donc pas égale à une fonction anonyme, bien que certaines personnes appellent ces fonctions The la fonction créée en interne est une fonction de fermeture, mais je pense qu'elle n'est pas exacte.

Jetons un coup d'œil au code suivant :

function init() {
    var name = "Zilongshanren"; // name 是在 init 函数里面创建的变量
    // displayName() 是一个内部函数,即一个闭包。注意,它不是匿名的。
    function displayName() {
        console.log(name);
    }
    //当 displayName 函数返回后,这个函数还能访问 init 函数里面定义的变量。
    return displayName;
}
var closure = init();
closure();
Zilongshanren
undefined
Copier après la connexion

displayName est une fonction créée à l'intérieur de la fonction init. Elle transporte toutes les informations de la portée interne de la fonction init, telles que. le nom ici. Lorsque la fonction displayName est renvoyée, elle transporte elle-même les informations d'environnement lors de sa création, c'est-à-dire la variable name dans la fonction init.

À quoi sert la fermeture ?

Après avoir compris ce qu'est une fermeture, vous vous demanderez peut-être : cette chose est si difficile à comprendre, à quoi sert-elle ?

Parce qu'il n'y a aucun moyen de créer des méthodes privées en JS. Ce n'est pas comme Java ou C++ qui ont le mot-clé privé pour définir des propriétés et des méthodes privées. En JS, seules les fonctions peuvent créer des objets appartenant à leur propre portée. JS n'a pas de portée de bloc ! J'écrirai un autre article pour présenter cela en détail plus tard.

Tout vétéran de la programmation sait que pour bien écrire un programme, l'encapsulation et l'abstraction doivent être bien utilisées ! L'incapacité de définir des propriétés et des méthodes privées signifie que l'encapsulation et l'abstraction ne peuvent pas du tout être utilisées. . .

Vous ne pouvez pas définir des choses privées, toutes les variables et fonctions sont publiques. Il y a évidemment un problème, Global is Evil !

Les fermetures sont notre sauveur !

Jetons un coup d'œil au code suivant :

var makeCounter = function() {
    var privateCounter = 0;
    function changeBy(val) {
        privateCounter += val;
    }
    return {
        increment: function() {
            changeBy(1);
        },
        decrement: function() {
            changeBy(-1);
        },
        value: function() {
            return privateCounter;
        }
    }
};
var counter1 = makeCounter();
var counter2 = makeCounter();
console.log(counter1.value()); /* Alerts 0 */
counter1.increment();
counter1.increment();
console.log(counter1.value()); /* Alerts 2 */
counter1.decrement();
console.log(counter1.value()); /* Alerts 1 */
console.log(counter2.value()); /* Alerts 0 */
0
2
1
0
undefined
Copier après la connexion

La variable privateCounter et changeBy ici sont privées et complètement invisibles en dehors de la fonction makeCounter. De cette façon, l'objet que nous générons via makeCounter cache toutes ses données privées et méthodes privées.

Ça vous rappelle quelque chose ?

Haha, n'est-ce pas juste OO ? Encapsulez les données et les méthodes d'exploitation des données, puis effectuez le traitement des données via des appels d'interface publique.

Bien sûr, vous pouvez dire que je peux également implémenter OO en utilisant l'héritage prototypique. Oui, c’est ce que font la plupart des gens maintenant, y compris nous-mêmes. Cependant, l’héritage est toujours très difficile à comprendre, car pour comprendre un morceau de code, il faut comprendre toutes ses chaînes d’héritage. S'il y a un bug dans le code, il sera très difficile à déboguer.

C'est trop loin. Voyons ensuite comment utiliser correctement les fermetures.

Comment utiliser correctement les fermetures ?

Les fermetures occuperont de la mémoire et affecteront également l'efficacité d'exécution du moteur js. Par conséquent, si un morceau de code est exécuté fréquemment, vous devez soigneusement envisager d'utiliser des fermetures dans ce code.

Regardons une fonction qui crée un objet :

function MyObject(name, message)
 {    this.name = name.toString();  
   this.message = message.toString();   
    this.getName = function()
     {        return this.name;    };   
      this.getMessage = function() 
      {        return this.message;    };}
      var myobj = new MyObject();
var myobj = new MyObject();
Copier après la connexion

Chaque fois qu'elle est appelée pour générer un nouvel objet, deux fermetures seront générées. S'il existe des milliers de ces objets MyObject dans votre programme, cela prendra beaucoup plus de mémoire.

L'approche correcte devrait être d'utiliser la chaîne de prototypes :

function MyObject(name, message) {
    this.name = name.toString();
    this.message = message.toString();
}
MyObject.prototype.getName = function() {
    return this.name;
};
MyObject.prototype.getMessage = function() {
    return this.message;
};
var myobj = new MyObject();
Copier après la connexion

Maintenant, le prototype MyObject définit deux méthodes Lorsque nous créons un objet via new, ces deux méthodes ne feront qu'un. copie stockée sur le prototype.

Comment se déroule la fermeture ?

Une fermeture est aussi une fonction, mais elle stocke des informations supplémentaires sur l'environnement, donc théoriquement elle prend plus de mémoire qu'une fonction pure, et le moteur JS consomme plus lors de l'interprétation et de l'exécution de la fermeture. Cependant, la différence de performances entre eux se situe entre 3 % et 5 % (il s'agit des données obtenues de Google, qui peuvent ne pas être trop précises).

Cependant, les avantages de la fermeture sont définitivement grands. Utilisez davantage les fermetures et la programmation sans état pour éloigner les bugs de nous.

En comprenant les fermetures, vous pouvez comprendre la plupart des bibliothèques de classes Js du paradigme FP et les idées de conception cachées derrière elles. Bien sûr, la clôture ne suffit pas. Vous devez également subir un lavage de cerveau avec des concepts tels que la PF, l’apatridie et le calcul lambda.

J'espère que vous comprendrez les fermetures js après avoir terminé cet article.

Recommandations associées :

Une explication simple des fermetures en JS

Comment comprendre les fermetures et les classes en JS

Une compréhension simple des fermetures 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!

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

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)

Recommandé : Excellent projet de détection et de reconnaissance des visages open source JS Recommandé : Excellent projet de détection et de reconnaissance des visages open source JS Apr 03, 2024 am 11:55 AM

La technologie de détection et de reconnaissance des visages est déjà une technologie relativement mature et largement utilisée. Actuellement, le langage d'application Internet le plus utilisé est JS. La mise en œuvre de la détection et de la reconnaissance faciale sur le front-end Web présente des avantages et des inconvénients par rapport à la reconnaissance faciale back-end. Les avantages incluent la réduction de l'interaction réseau et de la reconnaissance en temps réel, ce qui réduit considérablement le temps d'attente des utilisateurs et améliore l'expérience utilisateur. Les inconvénients sont les suivants : il est limité par la taille du modèle et la précision est également limitée ; Comment utiliser js pour implémenter la détection de visage sur le web ? Afin de mettre en œuvre la reconnaissance faciale sur le Web, vous devez être familier avec les langages et technologies de programmation associés, tels que JavaScript, HTML, CSS, WebRTC, etc. Dans le même temps, vous devez également maîtriser les technologies pertinentes de vision par ordinateur et d’intelligence artificielle. Il convient de noter qu'en raison de la conception du côté Web

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

En C++, une fermeture est une expression lambda qui peut accéder à des variables externes. Pour créer une fermeture, capturez la variable externe dans l'expression lambda. Les fermetures offrent des avantages tels que la réutilisabilité, la dissimulation des informations et une évaluation paresseuse. Ils sont utiles dans des situations réelles telles que les gestionnaires d'événements, où la fermeture peut toujours accéder aux variables externes même si elles sont détruites.

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

Les expressions C++ Lambda prennent en charge les fermetures, qui enregistrent les variables de portée de fonction et les rendent accessibles aux fonctions. La syntaxe est [capture-list](parameters)->return-type{function-body}. capture-list définit les variables à capturer. Vous pouvez utiliser [=] pour capturer toutes les variables locales par valeur, [&] pour capturer toutes les variables locales par référence, ou [variable1, variable2,...] pour capturer des variables spécifiques. Les expressions Lambda ne peuvent accéder qu'aux variables capturées mais ne peuvent pas modifier la valeur d'origine.

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

Une fermeture est une fonction imbriquée qui peut accéder aux variables dans la portée de la fonction externe. Ses avantages incluent l'encapsulation des données, la conservation de l'état et la flexibilité. Les inconvénients incluent la consommation de mémoire, l’impact sur les performances et la complexité du débogage. De plus, les fermetures peuvent créer des fonctions anonymes et les transmettre à d'autres fonctions sous forme de rappels ou d'arguments.

La relation entre js et vue La relation entre js et vue Mar 11, 2024 pm 05:21 PM

La relation entre js et vue : 1. JS comme pierre angulaire du développement Web ; 2. L'essor de Vue.js en tant que framework front-end ; 3. La relation complémentaire entre JS et Vue ; Vue.

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 Go est le suivant : Pointeurs de fonction : légèrement plus lents que les appels directs, mais améliorent la lisibilité et la réutilisabilité. Fermetures : généralement plus lentes, mais encapsulent les données et le comportement. Cas pratique : les pointeurs de fonction peuvent optimiser les algorithmes de tri et les fermetures peuvent créer des gestionnaires d'événements, mais ils entraîneront des pertes de performances.

Le rôle de la fermeture de la fonction Golang dans les tests Le rôle de la fermeture de la fonction Golang dans les tests Apr 24, 2024 am 08:54 AM

Les fermetures de fonctions du langage Go jouent un rôle essentiel dans les tests unitaires : Capture de valeurs : les fermetures peuvent accéder aux variables dans la portée externe, permettant ainsi de capturer et de réutiliser les paramètres de test dans des fonctions imbriquées. Simplifiez le code de test : en capturant les valeurs, les fermetures simplifient le code de test en éliminant le besoin de définir des paramètres à plusieurs reprises pour chaque boucle. Améliorez la lisibilité : utilisez des fermetures pour organiser la logique de test, rendant ainsi le code de test plus clair et plus facile à lire.

Appels enchaînés et fermetures de fonctions PHP Appels enchaînés et fermetures de fonctions PHP Apr 13, 2024 am 11:18 AM

Oui, la simplicité et la lisibilité du code peuvent être optimisées grâce à des appels et des fermetures enchaînés : les appels en chaîne lient les appels de fonction dans une interface fluide. Les fermetures créent des blocs de code réutilisables et accèdent à des variables en dehors des fonctions.

See all articles