La fermeture d'expression et l'appel de fonction sont-ils identiques en JavaScript ?
En JavaScript, les extraits de code suivants semblent produire un résultat identique :
<code class="js">(function() { bar = 'bar'; alert('foo'); })(); (function() { bar = 'bar'; alert('foo'); }());</code>
Les deux blocs exécutent l'instruction alert('foo') et déclarent une barre de variables accessible en dehors de la fermeture. La seule différence apparente réside dans la syntaxe de la fermeture, en utilisant )()} contre }());.
Ces constructions sont-elles fonctionnellement équivalentes ?
Réponse :Oui, ils sont identiques.
Considérations supplémentaires :
Si des parenthèses supplémentaires sont introduites, le comportement change. Considérez les scénarios suivants :
Scénario 1 :
<code class="js">new (function() { this.prop = 4; })().prop;</code>
Cette expression crée une nouvelle instance de la classe de la fonction et accède à la propriété prop de la nouvelle instance, renvoyant la valeur 4. Cela équivaut à :
<code class="js">function MyClass() { this.prop = 4; } new MyClass().prop;</code>
Scénario 2 :
<code class="js">new ( function() { return { Class: function() { } }; }() ).Class;</code>
Dans ce cas, la nouvelle expression instancie la propriété Class de la fonction valeur de retour. Les parenthèses autour de l'appel de fonction sont cruciales, indiquant que la fonction doit être invoquée immédiatement.
Cela équivaut à :
<code class="js">var namespace = { Class: function() { } }; function getNamespace() { return namespace; } new ( getNamespace() ).Class; // Or, new namespace.Class;</code>
Si les parenthèses ont été supprimées de l'appel à getNamespace() , l'expression instancierait la classe getNamespace et accéderait à la propriété Class de la 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!