57 votes

Qu'est-ce que cette pratique appelée en JavaScript?

Lorsque vous enroulez votre code JavaScript dans une fonction comme ceci:

(function(){

  var field = ...;
  function doSomthing(){...
  ...


})();

J'ai remarqué que cela résout portée des problèmes pour moi sur un grand nombre de pages web. Qu'est-ce que cette pratique s'appelle?

37voto

palswim Points 4353

Le modèle est appelé auto-invocation, une auto-invocation de la fonction. Il permet de créer une fermeture, mais c'est un effet de la forme (peut-être l'effet voulu), pas le modèle lui-même.

20voto

Nick Craver Points 313913

Pour clarifier un peu les commentaires ci-dessous, la plupart du temps, c'est la création d'une clôture, il permet à vos variables de portée locale, la fermeture, pour ne pas créer des variables globales, il garde les choses propre et évite d'éventuelles modifications indésirables de ces variables.

Il ya quelques excellentes réponses ici que d'expliquer le pourquoi d'un peu plus: Comment un javascript fermeture de travail?

C'est une création de la fermeture quand quelque chose à l'intérieur de ce champ d'activité est exposée à l'extérieur de la portée, ce qui est généralement le cas, mais je ne peux pas être sûr de votre exemple, sans voir plus de code. Si rien n'est exposé alors pas de fermeture est créé...sinon, c'est juste une fonction anonyme exécute immédiatement.

L' })(); format à la fin, par opposition à l' }); est en fait l'appel que la fermeture d'exécuter immédiatement, sans paramètres. Si vous aviez quelque chose, par exemple })(something); alors qu' something serait passé comme premier argument ici: (function(somethingParam){.

15voto

Jani Hartikainen Points 23183

L'emballage de la fonction est appelée un anonyme (il n'a pas de nom et il n'est pas assigné à une variable) self-executing (il s'exécute immédiatement, par lui-même) de la fonction.

Je ne me souviens pas de voir le nom exact de ce modèle, mais il empêche la variable de couler dans la portée globale.

12voto

David Murdoch Points 28521

Ben Alman présente un argument intéressant sur le généralement l'utilisation de la terminologie de ce "modèle".

Son blog, c'est ici (http://benalman.com/news/2010/11/immediately-invoked-function-expression/).

Si son post est trop long pour vous, voici mon résumé (je recommande toujours la lecture comme ce résumé laisse beaucoup):

Si vous voulez un nom de fonction à l'autonomie de l'exécution/l'invoque, qui devrait ressembler à ceci:

// Hello, my name is "foo". I am a named function.
// When I am invoked I invoke my self when I am invoked.
function foo(){
   foo();
}

Si vous voulez une fonction anonyme pour être autonomes, de l'exécution/l'invocation, il devrait ressembler à ceci:

// Hello, I have no name...
//   (though I am assigned to the variable "foo" it's not who I am).
// When I am invoked I invoke my self when I am invoked.
// In ECMAScript 5 I no longer work. :-(
var foo = function(){
    arguments.callee();
};

Si vous voulez une fonction anonyme pour être immédiatement exécuté/invoquée, il devrait ressembler à ceci:

// Hello, I have no name. I am immediately invoked.
// People sometimes call me a "self-invoking anonymous function"...
//    even though I don't invoke myself.
// Ben Alman calls me an "Immediately-Invoked Function Expression"...
//    or "iffy" for short.
(function(){ /...code.../ }());

Mes propres pensées sur le sujet:

Les autres réponses sont correctes; ce que vous me demandez est communément appelé un "auto invoquant la fonction anonyme."
Cependant, cette terminologie ne reflètent pas avec précision ce qui se passe réellement; "Immédiatement appelée à la Fonction d'Expression" (aka "douteuses", pour faire court) semble être un terme plus approprié.


Faits amusants pour impressionner vos amis:

Vous pouvez créer un Terrible comme ça, aussi:

!function(){
   alert("immediately invoked!");
}();

ou

+function(){
   alert("immediately invoked!");
}();

ou si vous êtes vraiment fou ( exemple ):

!1%-+~function(){
   alert("immediately invoked!");
}();

dans la plupart des navigateurs (si pas tous, j'en suis pas sûr), et l'effet sera le même (facebook utilise l' ! version).

6voto

Sean McMillan Points 5096

Douglas Crockford et le YUI équipe de l'appeler le motif de module.

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