Maison  >  Article  >  interface Web  >  Une compréhension simple des fermetures js

Une compréhension simple des fermetures js

一个新手
一个新手original
2017-10-10 10:09:461573parcourir

Définition de la Fermeture

 :

Une fermeture fait référence à une fonction qui a accès à une variable dans le cadre d'une autre fonction.

Une autre définition est utilisée ici :

Lorsqu'une fonction peut se souvenir et accéder à la portée lexicale dans laquelle elle se trouve, une fermeture est générée, même si la fonction Appelé en dehors du champ lexical dans lequel il a été défini.

Premier point : JavaScript est basé sur la portée lexicale
. La portée lexicale signifie que la portée est déterminée par la position de la déclaration de fonction lors de l'écriture du code.
Règles de recherche de portée lexicale : la recherche de portée s'arrête lorsque le premier identifiant correspondant est trouvé. Les identifiants portant le même nom peuvent être définis dans plusieurs niveaux de portées imbriquées, ce que l'on appelle « l'effet d'observation » (identifiants internes « ombre » des identifiants externes). Quels que soient les effets d'observation, la recherche de portée commence toujours à partir de la portée la plus interne dans laquelle se trouve le runtime, et se poursuit vers l'extérieur ou vers le haut jusqu'à ce que le premier identifiant correspondant soit rencontré. Peu importe où une fonction est appelée, ou comment elle est appelée, sa portée lexicale est déterminée uniquement par la position dans laquelle la fonction a été déclarée.
Deuxième point : JavaScript a une portée basée sur les fonctions, et les fonctions sont l'unité de portée la plus courante en JavaScript. Portée de la fonction
signifie que toutes les variables appartenant à cette fonction peuvent être utilisées et réutilisées dans la portée de la fonction entière (en fait, elles peuvent également être utilisées dans des portées imbriquées. Portée externe Rien à l'intérieur de la fonction encapsulée ne peut). être accessible.
Le troisième point : la fonction en JavaScript est un objet de première classe
1) Propriétés pouvant être attribuées aux variables, éléments de tableau et autres objets
2) Peut être passé à la fonction en paramètre
3) Peut être utilisé comme valeur de retour de la fonction

Le quatrième point : fermeture
function foo() {
    var a = 2;    
    function bar() {
        console.log( a ); // 2。bar()对 a 的引用的方法是词法作用域的查找规则,而这些规则只是闭包的一部分
    }
    bar();
}
foo();


Le code ci-dessus n'utilise pas réellement la fermeture L'application de la fermeture est généralement divisée en deux situations-fonction. comme valeur de retour, la fonction est passée en paramètre.

Réécrivez le code ci-dessus :
function foo() {
    var a = 2;    
    function bar() {
    console.log( a );
    }    return bar;//函数作为返回值}var baz = foo();
baz(); // 2 —— 朋友,这就是闭包的效果。


Ici, la portée lexicale de la fonction bar() a accès à la portée interne de foo(). Ensuite, nous passons la fonction bar() elle-même comme type valeur. Dans cet exemple, nous utilisons l'objet fonction référencé par bar lui-même comme valeur de retour.
Dans cet exemple, bar() est exécuté en dehors de sa portée lexicale définie. Après le retour de la fonction foo(), sa portée interne existe toujours et bar() contient toujours une référence à la portée, et cette référence est appelée une fermeture.

Écrivez un autre exemple de passage d'une fonction en paramètre :
var max = 10,
fn = function(x) {
    if (x > max) {//注意词法作用域规则,这里的max是10,而不是100.
        console.log(x);  //15
    }
};
(function(f) {
    var max = 100;
    f(15);
})(fn);

Le cinquième point : le mécanisme de récupération de place de JavaScript GC

En js, si un objet n'est plus étant Référence, alors cet objet sera recyclé par GC, sinon cet objet sera toujours sauvegardé en mémoire

Point 6 : Environnement d'exécution, objets actifs, scope et chaîne de scope


Une fois que tout le code d'un environnement d'exécution a été exécuté, l'environnement est détruit et toutes les variables et fonctions qui y sont enregistrées sont également détruites.

Lorsqu'une fonction est appelée, un environnement d'exécution et une chaîne de portée correspondante sont créés, et l'objet actif est initialisé à l'aide des valeurs des arguments et d'autres paramètres nommés.

Mais dans certains cas, une fois l'appel de fonction terminé, la chaîne de portée de son environnement d'exécution sera détruite, mais ses objets actifs resteront toujours en mémoire. C’est l’essentiel de ce que vous devez comprendre sur les fermetures.

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:
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