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 :-)
Réponses
Trop de publicités?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.
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.