


Une discussion détaillée des fonctions anonymes JavaScript et des compétences de Closures_Javascript
1. Fonction anonyme
Les fonctions sont les objets les plus flexibles de JavaScript. Nous expliquons ici uniquement l'utilisation de fonctions anonymes. Fonction anonyme : C'est une fonction sans nom de fonction.
1.1 Définition de la fonction, introduisez d'abord brièvement la définition de la fonction, qui peut être grossièrement divisée en trois manières
Le premier type : C'est aussi le type le plus courant
fonction double(x){
Renvoyez 2*x;
>
Deuxième méthode : cette méthode utilise le constructeur Function et traite à la fois la liste de paramètres et le corps de la fonction comme des chaînes. Ceci est très gênant et n'est pas recommandé.
var double = new Function('x', 'return 2 * x;');
Troisième type :
var double = function(x) { return 2* x }
Notez que la fonction à droite de "=" est une fonction anonyme. Après avoir créé la fonction, la fonction est affectée à la variable square.
1.2 Création de fonctions anonymes
La première méthode consiste à définir la fonction carré comme mentionné ci-dessus, qui est également l'une des méthodes les plus couramment utilisées.
La deuxième façon :
(fonction(x, y){
alerte(x y);
})(2, 3);
Une fonction anonyme est créée ici (à l'intérieur de la première parenthèse), et la deuxième parenthèse est utilisée pour appeler la fonction anonyme et transmettre les paramètres.
2. Clôture
Le mot anglais pour fermeture est Closure, qui est une partie très importante des connaissances en JavaScript, car l'utilisation de fermetures peut réduire considérablement la quantité de notre code, rendre notre code plus clair, etc. Bref, c'est très puissant.
La signification de la fermeture : pour parler franchement, la fermeture est l'imbrication de fonctions. La fonction interne peut utiliser toutes les variables de la fonction externe, même si la fonction externe a été exécutée (cela implique une chaîne de portée JavaScript).
Exemple 1
fonction checkClosure(){
var str = 'homme-pluie';
setTimeout(
function(){ alert(str); } //Il s'agit d'une fonction anonyme
, 2000);
>
checkClosure();
Cet exemple semble très simple. Il reste encore de nombreux points de connaissance après une analyse minutieuse de son processus d'exécution : l'exécution de la fonction checkClosure est instantanée (peut-être que cela ne prend que 0,00001 millisecondes), et une variable str est créée dans le corps de la fonction. de checkClosure. , str n'est pas libéré après l'exécution de checkClosure, car la fonction anonyme dans setTimeout a une référence à str. Après 2 secondes, la fonction anonyme dans le corps de la fonction est exécutée et str est libérée.
Exemple 2, code optimisé
fonction forTimeout(x, y){
alerte(x y);
>
fonction retard (x, y, temps){
setTimeout('forTimeout(' x ',' y ')' , time); >
/**
* La fonction de retard ci-dessus est très difficile à lire et pas facile à écrire, mais si vous utilisez des fermetures, le code peut être rendu plus clair
* fonction retard(x, y, temps){
* setTimeout(
* fonction(){
* forTimeout(x, y)
* * , heure);
*🎜> */
3. Exemple
Exemple 3 :
var oEvent = {};
(fonction(){
var addEvent = function(){ /*Implémentation du code omise*/ };
Fonction RemoveEvent(){}
oEvent.addEvent = addEvent;
oEvent.removeEvent = removeEvent;
})();
Dans ce code, les fonctions addEvent et removeEvent sont des variables locales, mais nous pouvons les utiliser via la variable globale oEvent, ce qui réduit considérablement l'utilisation de variables globales et améliore la sécurité de la page Web. Nous voulons utiliser ce code : oEvent.addEvent(document.getElementById('box') , 'click' , function(){});
Exemple 4 :
var rainman = (fonction(x, y){
Retourner x y ;
})(2, 3);
/**
* peut également être écrit sous la forme suivante, car la première parenthèse ne nous aide qu'à lire, mais le format d'écriture suivant n'est pas recommandé.
* var rainman = fonction(x, y){
* retourner x y ;
* }(2, 3);
*/
Ici on crée une variable rainman et on l'initialise à 5 en appelant directement la fonction anonyme. Cette petite astuce est parfois très pratique.
Exemple 5 :
var externe = null;
(fonction(){
var un = 1;
Fonction intérieure (){
un = 1 ;
alerte(une);
>
extérieur = intérieur;
})();
externe(); //2
externe(); //3
externe(); //4
La variable one dans ce code est une variable locale (car définie au sein d'une fonction), elle n'est donc pas accessible de l'extérieur. Mais ici, nous avons créé la fonction interne, qui peut accéder à la variable one ; et la variable globale external fait référence à inner, donc appeler external trois fois fera apparaître le résultat incrémentiel.
4.Attention
4.1 La fermeture permet à la fonction interne de faire référence à la variable dans la fonction parent, mais la variable est la valeur finale
Exemple 6 :
/**
*
*
- un
- deux
- trois
- un
*
*
*
*
*
*/
var lists = document.getElementsByTagName('li');
pour(var i = 0 , len = lists.length ; i < len ; i ){
Listes[ i ].onmouseover = function(){
alerte(i);
};
>
Vous constaterez que lorsque la souris se déplace sur chaque élément
Solution 1 :
var lists = document.getElementsByTagName('li');
pour(var i = 0 , len = lists.length ; i < len ; i ){
(fonction(index){
Listes[index].onmouseover = function(){
alerte(index);
})(i);
>
Solution 2 :
var lists = document.getElementsByTagName('li');
pour (var i = 0, len = lists.length; i < len; i ){
Lists[ i ].$$index = i; //Enregistrez l'indice en liant l'attribut $$index sur l'élément Dom
Listes[ i ].onmouseover = function(){
alert(this.$$index);
};
>
Solution trois :
fonction eventListener(liste, index){
List.onmouseover = function(){
alerte(index);
};
>
var lists = document.getElementsByTagName('li');
pour(var i = 0 , len = lists.length ; i < len ; i ){
EventListener(listes[ i ] , i);
>
4.2 Fuite de mémoire
L'utilisation de fermetures peut facilement provoquer des fuites de mémoire dans le navigateur. Dans les cas graves, le navigateur se bloquera. Si vous êtes intéressé, vous pouvez vous référer à : http://www.jb51.net/article/57404. htm

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

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 !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

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.

Une fonction anonyme, également appelée expression lambda, est une fonction qui ne spécifie pas de nom et qui est utilisée pour un usage unique ou pour transmettre un pointeur de fonction. Les fonctionnalités incluent : l’anonymat, l’utilisation unique, les fermetures, l’inférence du type de retour. En pratique, il est souvent utilisé pour le tri ou d’autres appels de fonction ponctuels.

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.

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.

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.

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.

Oui, les fonctions anonymes du langage Go peuvent renvoyer plusieurs valeurs. Syntaxe : func(arg1,arg2,...,argN)(ret1,ret2,...,retM){//Function body}. Utilisation : utilisez l'opérateur := pour recevoir la valeur de retour ; utilisez le mot-clé return pour renvoyer plusieurs valeurs.

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.
