Maison > Article > interface Web > Est-ce que \"(function () { } ) ( )\" et \"(function () { } ( ) )\" sont fonctionnellement identiques en JavaScript ?
Syntaxe d'invocation de fonction en JavaScript : "(function ( ) { } ) ( )" et "(function ( ) { } ( ) )" sont-ils fonctionnellement identiques ?
Question :
Considérez les deux blocs de code JavaScript suivants :
(function() { bar = 'bar'; alert('foo'); })(); alert(bar);
(function() { bar = 'bar'; alert('foo'); }()); alert(bar);
Les deux blocs de code exécutent alert('foo' ) puis alert(bar), affichant respectivement 'foo' et 'bar'. La seule différence entre les deux réside dans la syntaxe de l’invocation de la fonction. Sont-ils fonctionnellement identiques ?
Réponse :
Oui, en général, les deux blocs de code sont fonctionnellement équivalents. Ils définiront tous les deux une nouvelle fonction, l'exécuteront immédiatement, puis accéderont à la variable bar dans la portée globale.
Exceptions :
Cependant, il existe des cas extrêmes où les deux syntaxes peuvent se comporter différemment. Plus précisément, si vous introduisez un nouveau code avant la fonction ou après un .something dans la fonction, ils ne se comporteront plus de manière identique.
Code 1 :
new (function() { this.prop = 4; }) ().prop;
Ce code crée une nouvelle instance de la classe de la fonction et récupère la propriété prop de la nouvelle instance, renvoyant 4. Il est équivalent à :
function MyClass() { this.prop = 4; } new MyClass().prop;
Code 2 :
new ( function() { return { Class: function() { } }; }() ).Class;
Ce code appelle new sur la propriété Class. Étant donné que les parenthèses de l'appel de fonction se trouvent entre les parenthèses extérieures, elles ne déclenchent pas la nouvelle expression et appellent plutôt la fonction normalement, renvoyant sa valeur de retour. La nouvelle expression s'instancie jusqu'au .Class et l'instancie. C'est équivalent à :
var namespace = { Class: function() { } }; function getNamespace() { return namespace; } new ( getNamespace() ).Class; //Or, new namespace.Class;
Sans parenthèses autour de l'appel à getNamespace(), ce code serait analysé comme (new getNamespace()).Class, instanciant la classe getNamespace et renvoyant la propriété Class du nouvelle instance.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!