Les fermetures en JavaScript sont vraiment une question clichée. Récemment, j'ai posé des questions sur mes propres compétences d'expression et je ne peux pas les soutenir pleinement. Je suis fou. Sur le chemin du retour, j'ai soudainement pensé à une chose très simple. En fait, lorsque nous faisons des projets, nous utilisons souvent des fermetures, mais lorsque nous posons des questions, les réponses sont souvent les réponses que nous trouvons souvent. Hélas, que nous ayons affaire à des entretiens ou que nous voulions vraiment apprendre quelque chose, je partagerai avec vous ma propre compréhension et l'écriture est inévitable.
1. Qu'est-ce qu'une fermeture?
Le livre de Red Bao dit: "Il fait référence à une fonction qui a le droit d'accéder aux variables dans une autre portée de fonction."
En termes simples, JavaScript permet l'utilisation de fonctions internes - c'est-à-dire que les définitions de fonction et les expressions de fonction sont situées dans le corps de fonction d'une autre fonction. De plus, ces fonctions internes peuvent accéder à toutes les variables locales, paramètres et autres fonctions internes déclarées dans la fonction externe où ils résident. Lorsque l'une de ces fonctions internes est appelée en dehors de la fonction externe les contenant, une fermeture est formée. En termes simples, c'est "une fonction crée une autre fonction à l'intérieur, et cette dernière fonction peut lire les variables de la fonction ci-dessus, et cette dernière fonction peut être appelée" fermeture "".
2. Quelle est l'utilisation des fermetures?
Grâce à mon examen approfondi, si nous disons "en utilisant des fermetures, nous pouvons faire beaucoup de choses. Par exemple, nous simulons le style de code orienté objet; exprimons le code plus élégamment et de manière concise; et améliorons l'efficacité d'exécution du code à certains aspects", se sentira-t-il vide? Est-ce que ce sera meilleur? Puisqu'il n'y a pas de portée réelle au niveau du bloc en JavaScript, mais afin de déclarer certaines variables locales que seule la fonction peut utiliser, nous utiliserons les fermetures, afin que nous puissions réduire considérablement les variables dans la portée globale et purifier la portée globale.
Voici quelques exemples:
1. Fonction anonyme auto-exécutante
Nous savons que si toutes les variables ne sont pas ajoutées avec le mot clé VAR, la valeur par défaut sera ajoutée aux propriétés de l'objet global. Il existe de nombreux inconvénients à l'ajout de telles variables temporaires à l'objet global.
Par exemple: d'autres fonctions peuvent abuser de ces variables; Rendre l'objet global trop grand et affecter la vitesse d'accès (car la valeur de la variable doit être traversée de la chaîne prototype).
À chaque fois que nous utilisons la variable, nous utilisons le mot-clé VAR. Dans les situations réelles, nous rencontrons souvent une situation où certaines fonctions ne doivent être exécutées qu'une seule fois, et leurs variables internes n'ont pas besoin d'être maintenues.
Par exemple, dans l'initialisation de l'interface utilisateur, nous pouvons utiliser des fermetures:
var data = {table: [], arbre: {}}; (fonction (dm) {for (var i = 0; i <dm.Table.Rows; i ++) {var row = dm.Table.Rows [i]; for (var j = 0; j <row.cells; i ++) {drawCell (i, j);}}}) (data);Nous créons une fonction anonyme et l'exécutons immédiatement. Étant donné que l'extérieur ne peut pas se référer aux variables à l'intérieur, la ressource sera publiée immédiatement après l'exécution de la fonction. La clé n'est pas de polluer l'objet global.
2. Cache de résultat
Nous rencontrerons de nombreuses situations de développement. Imaginez que nous avons un objet de fonction très long qui prend beaucoup de temps pour traiter chaque appel. Ensuite, nous devons stocker la valeur calculée. Lorsque nous appelons cette fonction, nous recherchons d'abord dans le cache. Si cela ne peut être trouvé, nous effectuerons des calculs, puis mettons à jour le cache et renvoyez la valeur. Si cela est trouvé, nous pouvons renvoyer directement la valeur trouvée. Les fermetures font exactement cela car elle ne publie pas de références externes, afin que les valeurs à l'intérieur de la fonction puissent être préservées.
var cachedSearchbox = (function () {var cache = {}, count = []; return {attachSearchbox: function (dsid) {if (dsid in cache) {// si le résultat est dans le cache return cache [dsid]; // renvoie l'objet dans le cache directement} var fsb = newit.webctrl cache [dsid] = fsb; // Mettez à jour le cache if (count.length> 100) {// Taille de cache de sécurité <= 100 CACHE [COUNT.SHIFT ();} CachedSearchbox.AttachSearchbox ("entrée");De cette façon, nous lirons l'objet à partir du cache du deuxième appel.
3. Emballage
var personne = fonction () {// La portée de la variable est à l'intérieur de la fonction, et le nom var ne peut pas être accessible à l'extérieur. var name = "Default"; return {getName: function () {return name; }, setName: function (newname) {name = newname; }}} (); print (personne.name); // Accédez directement, le résultat est un imprimé non défini (personne.getName ()); personne.setName ("Abruzzi"); print (personne.getName ());4. Implémenter les classes et l'héritage
fonction personne () {var name = "default"; return {getName: function () {return name; }, setName: function (newname) {name = newname; }}}; var p = new personne (); P.SetName ("Tom"); alert (p.getName ()); var jack = function () {}; // hérité de la personne jack.prototype = new personne (); // Ajouter une méthode privée jack.prototype.say = function () {alert ("Bonjour, mon nom est jack"); }; var j = new Jack (); J.SetName ("Jack"); J.Say (); alert (j.getName ());À la fin de l'écriture, je ne sais pas qu'en fin de compte, vous avez tous constaté que vous en avez réellement utilisé beaucoup dans les projets que vous avez réalisés. Quoi qu'il en soit, je l'ai rencontré, et c'est comment les fermetures existent.
Bien qu'il soit cliché, il est encore très important. Quant aux défauts des fermetures, dites simplement que si vous n'abusez pas de fermetures, cela entraînera des fuites de mémoire. Quelle est la fuite de mémoire sur Baidu? ^ _ ^.
La brève analyse et l'interprétation des fermetures en JavaScript ci-dessus (incontournable) est tout le contenu que je partage avec vous. J'espère que vous pourrez vous faire référence et j'espère que vous pourrez soutenir Wulin.com plus.