Maison > interface Web > js tutoriel > Les parenthèses dans les appels de fonction JavaScript et les fermetures sont-elles toujours du sucre syntaxique ?

Les parenthèses dans les appels de fonction JavaScript et les fermetures sont-elles toujours du sucre syntaxique ?

DDD
Libérer: 2024-11-02 20:33:31
original
535 Les gens l'ont consulté

Are Parentheses in JavaScript Function Calls and Closures Always Just Syntactic Sugar?

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

Scénario 2 :

<code class="js">new ( function() {
    return { Class: function() { } }; 
}() ).Class;</code>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal