117 votes

Avancé Javascript: Pourquoi cette fonction est-elle entourée de parenthèses?

Dupliquer possible:
Quelle est cette construction en javascript?

Je suis tombé sur ce morceau de code Javascript mais je ne sais pas quoi en faire. Pourquoi ai-je "1" lorsque je lance ce code? Qu'est-ce que cet étrange petit appendice de (1) et pourquoi la fonction est-elle entourée de parenthèses?

 (function(x){
    delete x;
    return x;
})(1);
 

Merci :-)

242voto

Howard Yeend Points 1460

Il y a quelques choses qui se passent ici. Le premier est le immédiatement appelé la fonction de l'expression (IIFE) modèle:

(function() {
  // some code
})();

Cela permet d'exécuter un code JS dans son propre champ d'application. Il est généralement utilisé de sorte que toutes les variables créées au sein de la fonction n'affecte pas la portée globale. Vous pouvez l'utiliser à la place:

function foo() {
  // some code
}
foo();

Mais cela exige de donner un nom à la fonction, ce qui n'est pas toujours nécessaire. À l'aide d'une fonction nommée signifie aussi à un certain moment de l'avenir de la fonction peut être appelée de nouveau qui pourrait ne pas être souhaitable. En utilisant une fonction anonyme de cette manière vous assurer qu'il ne s'exécute qu'une fois.

Cette syntaxe n'est pas valide:

function() {
  // some code
}();

Parce que vous devez envelopper la fonction dans les parenthèses, afin de le faire analyser comme une expression. Plus d'infos ici: http://benalman.com/news/2010/11/immediately-invoked-function-expression/

Donc, pour résumer rapidement sur le IIFE modèle

(function() {
  // some code
})();

Permet de 'code' pour être exécuté immédiatement, comme si c'était écrit en ligne, mais aussi à l'intérieur de son propre champ d'application de façon à ne pas affecter l'espace de noms global (et donc potentiellement interférer avec, ou être perturbé par d'autres scripts).

Vous pouvez passer des arguments à votre fonction comme une fonction normale, par exemple

(function(x) {
  // some code
})(1);

Nous sommes donc en passant la valeur '1' comme premier argument de la fonction, qui le reçoit comme un localement étendue variable, nommée x.

Deuxièmement, vous avez le courage de le code de la fonction elle-même:

delete x;
return x;

L'opérateur delete va supprimer les propriétés des objets. Il ne supprime pas les variables. De la sorte;

var foo = {'bar':4, 'baz':5};
delete foo.bar;
console.log(foo);

Les résultats de cet être connecté:

{'baz':5}

Considérant que,

var foo = 4;
delete foo;
console.log(foo);

enregistre la valeur 4, parce que foo est une variable non une propriété et ne peut donc pas être supprimé.

Beaucoup de gens supposent que supprimer pouvez supprimer les variables en raison de la façon autoglobals travail. Si vous affecter à une variable sans la déclarer tout d'abord, il ne sera pas réellement devenir une variable, mais une propriété sur l'objet global:

bar = 4; // note the lack of 'var'. Bad practice! Don't ever do this!
delete bar;
console.log(bar); // error - bar is not defined.

Cette fois, le supprimer fonctionne parce que vous n'êtes pas supprimer-ing une variable, mais une propriété sur l'objet global. En effet, l'extrait précédent est équivalent à ceci:

window.bar = 4;
delete window.bar;
console.log(window.bar);

Et maintenant, vous pouvez voir comment c'est comme pour l'objet foo exemple, et non la variable foo exemple.

12voto

xdazz Points 85907

Cela signifie que vous avez créé une fonction anonyme et que vous l'appelez avec le paramètre 1 .

C'est la même chose que:

 function foo(x) {
    delete x;
    return x;
}
foo(1);
 

2voto

danp Points 4502

La raison que vous obtenez toujours 1 retourné, c'est que le mot clé delete est pour la suppression des propriétés des objets. Le reste est comme d'autres l'ont commenté, tout enveloppé dans des crochets s'exécute comme une fonction, et la deuxième série de crochets sont les arguments passés à bloc.

Voici le MDN référence pour les supprimer, et le MDN de référence pour les fermetures, qui traite également des fonctions anonymes.

2voto

hugomg Points 29789

Les gens appellent normalement ces "expressions de fonction immédiatement appelées" ou "fonctions à exécution automatique".

L'intérêt de ceci est que les variables déclarées à l'intérieur de cette fonction ne fuient pas vers l'extérieur.

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