Quel est le terme pour une fonction JavaScript anonyme qui est appelée immédiatement?

29

J'écris un guide de style JavaScript pour mon équipe, afin que nous puissions organiser et contribuer nos documents plus facilement. Mais j'ai touché une petite bosse, c'est là que ma question s'applique ...

Comment suis-je censé appeler une fonction JavaScript anonyme qui est appelée immédiatement. Je sais que je pourrais tout simplement l'appeler une "fonction anonyme", mais je voudrais souligner le fait qu'elle est appelée immédiatement.

Voici un exemple:

var MyVariable = (function(data){
  return "another value"
})("some value"); 

console.log(MyVariable);
// "another value"
silentBeep
la source
1
Notez que vous verrez souvent cette construction (inexactement) appelée "fonction auto-appelante"
AakashM

Réponses:

39

Ils ont déjà un terme pour cela dans le monde Javascript. Elles sont appelées expressions de fonction immédiatement appelées (IIFE) .

Ce que c'est

Les fonctions IIFE ne reçoivent pas de nom. Au lieu de cela, ils sont exécutés une fois lorsque l'interprète les rencontre:

var area = function() {
    var width = 3;
    var height = 2;
    return width * height;
}();

Les parenthèses finales après l'accolade fermante du bloc de code indiquent à l'interpréteur d'appeler immédiatement l'expression de fonction.

Si vous écrivez une déclaration de fonction, vous devez ajouter des opérateurs de regroupement ou des parenthèses entourant la fonction pour indiquer à l'interpréteur de traiter la fonction comme une expression qui peut être immédiatement invoquée:

var area;
(function() {
    var width = 3;
    var height = 2;
    area = width * height;
}());


Quand ils sont utilisés

Les IIFE sont utilisés pour le code qui n'a besoin d'être exécuté qu'une seule fois dans une tâche, plutôt que d'être appelé à plusieurs reprises.

  1. Comme argument lorsqu'une fonction est appelée (pour calculer des valeurs, etc.)
  2. Pour affecter la valeur d'une propriété à un objet.
  3. Dans les gestionnaires d'événements et les auditeurs.
  4. Pour éviter les conflits entre deux scripts pouvant utiliser les mêmes noms de variables. Ils peuvent être utilisés comme wrappers pour déposer du code dans un autre script où vous n'êtes pas sûr que les noms de variables soient les mêmes.
Lawrence Aiello
la source
One nitpick: Dans votre exemple d'utilisation var area = ..., vous n'avez pas besoin des parenthèses "wrapping" sur la fonction, car c'est déjà une expression de fonction du fait qu'elle se trouve sur le côté droit de la =. Les parenthèses enveloppantes ne sont nécessaires que lorsque la fonction est écrite en tant que déclaration de fonction (c'est-à-dire sans le début var area = ...).
Eric King
@EricKing l'ai-je bien fait?
Lawrence Aiello
Il pourrait être agréable de pouvoir appeler de manière plus désinvolte ces «fonctions express»
passoire
@ LawrenceAiello J'ai ajouté une modification pour montrer ce que je voulais dire. Espérons que cela fonctionne toujours pour vous.
Eric King
Comme question connexe, y a-t-il une raison de soumettre un argument à l'IIFE comme le montre la question? Je n'ai jamais vu cela comme la façon dont vous démontrez - sans aucun argument (car tout argument peut être une variable locale).
Kat