Maison > interface Web > js tutoriel > Est-ce que \'(function () { } ) ( )\' et \'(function () { } ( ) )\' sont fonctionnellement identiques en JavaScript ?

Est-ce que \'(function () { } ) ( )\' et \'(function () { } ( ) )\' sont fonctionnellement identiques en JavaScript ?

Linda Hamilton
Libérer: 2024-10-30 07:29:03
original
763 Les gens l'ont consulté

Are

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);
Copier après la connexion
(function()
{
    bar = 'bar';
    alert('foo');
}());

alert(bar);
Copier après la connexion

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

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

Code 2 :

new ( function() {
    return { Class: function() { } }; 
}() ).Class;
Copier après la connexion

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

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal