396 votes

Expliquer la syntaxe de la fonction anonyme encapsulée.

Resumen

Pouvez-vous expliquer le raisonnement qui sous-tend la syntaxe des fonctions anonymes encapsulées en JavaScript ? Pourquoi cela fonctionne-t-il ? (function(){})(); mais ce n'est pas le cas : function(){}(); ?


Ce que je sais

En JavaScript, on crée une fonction nommée comme ceci :

function twoPlusTwo(){
    alert(2 + 2);
}
twoPlusTwo();

Vous pouvez également créer une fonction anonyme et l'affecter à une variable :

var twoPlusTwo = function(){
    alert(2 + 2);
};
twoPlusTwo();

Vous pouvez encapsuler un bloc de code en créant une fonction anonyme, puis en l'entourant de parenthèses et en l'exécutant immédiatement :

(function(){
    alert(2 + 2);
})();

Ceci est utile lors de la création de scripts modulaires, pour éviter d'encombrer la portée actuelle, ou la portée globale, avec des variables potentiellement conflictuelles - comme dans le cas des scripts Greasemonkey, des plugins jQuery, etc.

Maintenant, je comprends pourquoi ça marche. Les parenthèses enferment le contenu et n'exposent que le résultat (je suis sûr qu'il y a une meilleure façon de décrire cela), comme avec (2 + 2) === 4 .


Ce que je ne comprends pas

Mais je ne comprends pas pourquoi cela ne fonctionne pas aussi bien :

function(){
    alert(2 + 2);
}();

Vous pouvez m'expliquer ça ?

44 votes

Je pense que toutes ces notations variées et ces façons de définir/établir/appeler les fonctions sont la partie la plus déroutante du travail initial avec javascript. Les gens ont tendance à ne pas en parler non plus. Ce n'est pas un point sur lequel on insiste dans les guides ou les blogs. Cela m'étonne parce que c'est quelque chose de déroutant pour la plupart des gens, et les personnes qui parlent couramment le js doivent être passées par là aussi. C'est comme une réalité taboue et vide dont on ne parle jamais.

1 votes

Lisez également ce qui concerne le objectif de cette construction ou vérifier un ( technique ) explication (également aquí ). Pour le placement de la parenthèse, voir cette question sur leur localisation .

0 votes

OT : Pour ceux qui veulent savoir où ces fonctions anonymes sont beaucoup utilisées, lisez svp adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html

0voto

Csaba K. Points 49

Vous pouvez aussi l'utiliser comme :

! function() { console.log('yeah') }()

o

!! function() { console.log('yeah') }()

! - L'opération de négation convertit la définition de fn en expression fn, par conséquent, vous pouvez l'invoquer immédiatement avec () . Comme pour l'utilisation de 0,fn def o void fn def

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X