Maison >interface Web >js tutoriel >Les fonctions anonymes sont-elles toujours des fermetures en JavaScript ?

Les fonctions anonymes sont-elles toujours des fermetures en JavaScript ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-01 11:02:30412parcourir

Are Anonymous Functions Always Closures in JavaScript?

Fermetures vs fonctions anonymes en JavaScript

Les fermetures JavaScript sont devenues un sujet de confusion pour certains développeurs. Bien que toutes les fonctions JavaScript soient des fermetures, un sous-ensemble spécifique présente un intérêt théorique particulier. Cet article vise à clarifier le concept et à déterminer lequel des deux blocs de code utilise avec précision les fermetures.

Comprendre les fermetures :

Une fermeture est une fonction qui capture et maintient l'accès à variables de sa portée englobante, même après que cette portée n'est plus active. Essentiellement, une fermeture est une fonction qui possède une mémoire et peut accéder aux données de sa portée parent, appelées « variables de portée parent » ou « valeurs positives ».

Identification des fermetures :

Pour déterminer si une fonction est une fermeture, nous devons examiner ses variables. Les fonctions qui n'ont pas de variables non locales (c'est-à-dire des variables librement variables) ne peuvent pas être des fermetures. Les fonctions avec des variables non locales doivent être référencées en dehors de leur portée parent pour devenir des fermetures.

Cas 1 : Programme d'un ami

<code class="javascript">for(var i = 0; i < 10; i++) {
    (function(){
        var i2 = i;
        setTimeout(function(){
            console.log(i2);
        }, 1000)
    })();
}</code>

Dans ce cas, la fonction ne contient aucune variable de portée parent fermée et ne constitue donc pas une fermeture. Cependant, la fonction interne passée à setTimeout est une fermeture car elle capture et maintient l'accès à la variable libre i2.

Cas 2 : Programme de l'auteur

<code class="javascript">for(var i = 0; i < 10; i++) {
    setTimeout((function(i2){
        return function() {
            console.log(i2);
        }
    })(i), 1000);
}</code>

Ici , la fonction interne conserve l'accès à la variable libre i2 et reste une fermeture même lorsqu'elle est référencée en dehors de son parent portée.

Conclusion :

Dans les deux cas, des fermetures sont utilisées. Le programme de l'auteur utilise une fermeture pour capturer correctement la valeur de i. En renvoyant une autre fonction et en la transmettant à setTimeout, la fonction interne peut accéder à la variable fermée i2. Cela garantit que la valeur correcte est imprimée sur la console après le délai.

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