Pourquoi utilisons-nous des fonctions auto-exécutables dans le modèle de module révélateur ?
-
13-11-2019 - |
Question
J'utilise activement le modèle de module révélateur depuis des années, mais il y a certaines choses que j'aimerais comprendre plus en profondeur.D'après ce que j'ai compris, les avantages potentiels des fonctions auto-exécutables sont l'anonymat et l'auto-exécution, qui ne semblent pas tous deux nécessaires/utilisés dans ce modèle particulier.L'autre chose que je ne comprends pas, c'est ce qui, dans le scénario ci-dessous, permet d'envelopper la fonction Init dans la fonction SocialMedia (), c'est-à-dire une fonction intégrée, les fonctions auto-exécutables semblent être une construction tout à fait unique dans JS, n'est-ce pas ? N'est-il pas étrange que nous puissions simplement attribuer des valeurs de propriétés à un bloc de code auto-exécutable ?
var myObj = {
prop1, "prop1value",
SocialMedia: (function () {
function Init() {
}
return {
Init: Init
}
})()
}
La solution
Pourquoi utilisons-nous des fonctions auto-exécutables dans le modèle de module révélateur ?
JavaScript possède des fonctions de première classe et manque de portée de bloc, les fonctions sont donc utilisées pour introduire de nouvelles portées.
ce qui, dans le scénario ci-dessous, permet d’encapsuler la fonction Init à l’intérieur de la fonction SocialMedia(), c’est-à-dire une fonction intégrée ...n'est-il pas étrange que nous puissions simplement attribuer des valeurs de propriétés à un bloc de code auto-exécutable ?
En JavaScript, une fonction est simplement un objet qui répond à la ()
et new
les opérateurs.
Comme les autres objets, vous pouvez l'utiliser lorsque vous le définissez ou le stocker dans une variable ou une propriété pour une utilisation ultérieure.
les fonctions auto-exécutables semblent être une construction tout à fait unique dans JS
Ce n'est pas propre à JavaScript.Toutes les langues qui ont fonctions de première classe avoir cette propriété, par exemple :
- Zézayer,
- OCaml,
- Scala,
- Aller,
- C# (via les délégués),
- C (via fn ptrs),
- Python,
- Perl (via
&
), - Rubis,
- Lua
Dans le développement récent du langage, les fonctions de première classe sont la norme plutôt que la règle.Les langages à typage non statique facilitent simplement les choses car il n'y a pas de surcharge dans la syntaxe du système de types et aucun variance problèmes.
Même Java pourrait prendre le train en marche avec Lambdas prévus pour Java 8.
Dans beaucoup de ces autres langages, les fonctions immédiatement appelées ne sont cependant pas très utiles.La plupart des autres langues sont à portée de bloc donc si vous souhaitez garder vos variables séparées, utilisez simplement un {...}
bloc.En JavaScript cependant, var
est limité au plus petit contenant function
ou Programme, donc function
C'est le moyen le plus simple d'introduire une nouvelle portée.
Rubis fait très peu de distinction entre les blocs et les fonctions et pourrait donc être considéré comme similaire à JS à cet égard.
Autres conseils
Les fonctions d'auto-exécution sont utilisées pour introduire de nouvelles étendues, voir également la réponse Mike Samuels.
Il y a deux raisons pour cela:
- Évitez de polluer la portée globale
- utilisation de fermetures, c'est-à-dire "" exportation "une fonction d'une portée supplémentaire
Bien sûr, vous pouvez empiler des étendues, mais vous ne créerez généralement pas que les gros modules où vous devez éviter de polluer votre module locale: -)
En outre, la fonction d'exécution auto-exécutive dans votre exemple est inutile, car elle est totalement équivalente à
var myObj = { prop1: "prop1value", SocialMedia: { Init: function Init() { } } }