Maison interface Web js tutoriel Exemple d'utilisation de la fermeture Javascript Compétences Analysis_Javascript

Exemple d'utilisation de la fermeture Javascript Compétences Analysis_Javascript

May 16, 2016 pm 04:18 PM
javascript 用法 闭包

Cet article analyse le concept et l'utilisation des fermetures Javascript avec des exemples. Partagez-le avec tout le monde pour votre référence. Les détails sont les suivants :

En ce qui concerne les fermetures, tout le monde doit en avoir entendu parler. Voici ma simple compréhension.
Pour être honnête, il n'existe pas beaucoup de scénarios dans lesquels les fermetures sont réellement écrites manuellement dans le travail quotidien, mais les frameworks et composants tiers utilisés dans le projet utilisent plus ou moins les fermetures.
Il est donc essentiel de comprendre les fermetures. Haha...

1. Qu'est-ce que la fermeture

En bref, c'est une fonction qui peut lire les variables internes d'autres fonctions.
En raison des caractéristiques de la portée des variables JS, les variables internes ne sont pas accessibles de l'extérieur, mais les variables externes sont accessibles de l'intérieur.

2. Scénarios d'utilisation

1. Implémentez les membres privés.
2. Protégez l'espace de noms et évitez de polluer les variables globales.
3. Mettre en cache les variables.

Regardons d'abord un exemple d'encapsulation :

Copier le code Le code est le suivant :
var person = function() {
//La portée de la variable est à l'intérieur de la fonction et n'est pas accessible de l'extérieur
var nom = "par défaut";

revenir {
          getName : function () {
              renvoyer le nom ;
},
setName : fonction (nouveauNom) {
              nom = nouveauNom;
>
>
}();

console.log(person.name); // Accès direct, le résultat est : undefined
console.log(person.getName()); // Le résultat est : par défaut
console.log(person.setName("langjt"));
console.log(person.getName()); // Le résultat est : langjt

Regardez les fermetures couramment utilisées dans les boucles pour résoudre le problème du référencement de variables externes :

Copier le code Le code est le suivant :
var aLi = document.getElementsByTagName('li');
pour (var i=0, len=aLi.length; i aLi[i].onclick = function() {
alert(i); // Quel que soit l'élément
  • sur lequel vous cliquez, la valeur qui apparaît est len, indiquant que la valeur de i ici est la même que la valeur de i imprimée après for.
    };
    >

  • Après avoir utilisé la fermeture :
    Copier le code Le code est le suivant :
    var aLi = document.getElementsByTagName('li');
    pour (var i=0, len=aLi.length; i aLi[i].onclick = (function(i) {
    Fonction de retour() {
    alert(i); // Cliquez sur l'élément
  • à ce moment-là, et l'indice correspondant apparaîtra.
    >
    })(i);
    >
  • 3. Précautions

    1. Fuite de mémoire

    Étant donné que les fermetures entraînent le stockage de toutes les variables de la fonction en mémoire, ce qui consomme beaucoup de mémoire, les fermetures ne peuvent pas être abusées, sinon cela entraînerait des problèmes de performances sur la page Web.
    Par exemple :

    Copier le code Le code est le suivant :
    function foo() {
    var oDiv = document.getElementById('J_DIV');
    var id = oDiv.id;
    oDiv.onclick = function() {
    // alert(oDiv.id); Il y a une référence circulaire ici, et oDiv est toujours en mémoire après la fermeture de la page de la version basse d'IE. Mettez donc en cache les types primitifs au lieu des objets autant que possible.
    ​​ alerte(id);
    };
    oDiv = nul;
    >

    2. Dénomination des variables

    Si le nom de variable de la fonction interne et le nom de variable de la fonction externe sont les mêmes, alors la fonction interne ne peut plus pointer vers la variable portant le même nom de la fonction externe.
    Par exemple :

    Copier le code Le code est le suivant :
    function foo(num) {
    fonction de retour (num) {
    console.log(num);
    >
    >
    var f = nouveau foo(9);
    f(); // non défini

    其實上面的用法,專業術語叫函數柯里化(Currying),就是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,並且返回接受餘下的參數而且傳回結果的新函數的技術。本質上也利用了閉包可以快取的特性,例如:

    複製程式碼 程式碼如下:
    var adder = function(num) {
        return function(y) {
            return num y;
        };
    };

    var inc = adder(1);
    var dec = adder(-1);
    //inc, dec現在是兩個新的函數,作用是將傳入的參數值 ( /‐)1
    alert(inc(99));//100
    alert(dec(101));//100
    alert(adder(100)(2));//102
    alert(adder(2)(100));//102

    再例如阿里玉伯的seaJS源碼中:

    複製程式碼 程式碼如下:
    /**
     * util-lang.js - 最小的語言增強
     */
    function isType(type) {
      return function(obj) {
        return {}.toString.call(obj) == "[object " type "]"
      }
    }

    var isObject = isType("Object");
    var isString = isType("String");

    希望本文所述對大家的javascript程式設計有所幫助。

    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

    AI Hentai Generator

    AI Hentai Generator

    Générez AI Hentai gratuitement.

    Article chaud

    R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
    2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    Hello Kitty Island Adventure: Comment obtenir des graines géantes
    1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
    Combien de temps faut-il pour battre Split Fiction?
    4 Il y a quelques semaines By DDD
    Musée à deux points: toutes les expositions et où les trouver
    1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

    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)

    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.

    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.

    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

    Les fermetures en Java permettent aux fonctions internes d'accéder aux variables de portée externe même si la fonction externe est terminée. Implémentée via des classes internes anonymes, la classe interne contient une référence à la classe externe et maintient les variables externes actives. Les fermetures augmentent la flexibilité du code, mais vous devez être conscient du risque de fuite de mémoire, car les références à des variables externes par des classes internes anonymes maintiennent ces variables en vie.

    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.

    Utilisation correcte de la requête POST en PHP Utilisation correcte de la requête POST en PHP Mar 27, 2024 pm 03:15 PM

    L'utilisation de requêtes POST en PHP est une opération courante dans le développement de sites Web. Les données peuvent être envoyées au serveur via des requêtes POST, telles que les données de formulaire, les informations utilisateur, etc. Une utilisation appropriée des requêtes POST peut garantir la sécurité et l'exactitude des données. Ce qui suit présente l'utilisation correcte des requêtes POST en PHP et fournit des exemples de code spécifiques. 1. Principes de base des requêtes POST en PHP En PHP, les données soumises via la méthode POST peuvent être obtenues en utilisant la variable globale $_POST. La méthode POST convertit le numéro du formulaire en

    Résumé des avantages et des inconvénients des fonctions et fermetures anonymes de Golang Résumé des avantages et des inconvénients des fonctions et fermetures anonymes de Golang May 05, 2024 am 09:54 AM

    Les fonctions anonymes sont concises et anonymes, mais ont une mauvaise lisibilité et des difficultés de débogage ; les fermetures peuvent encapsuler les données et gérer l'état, mais peuvent entraîner une consommation de mémoire et des références circulaires. Cas pratique : Les fonctions anonymes peuvent être utilisées pour des traitements numériques simples, et les fermetures peuvent mettre en œuvre une gestion d'état.

    See all articles