55 votes

Est-ce que "(function ( ) { } ) ( )" et "(function ( ) { } ( ) )" sont fonctionnellement égaux en JavaScript ?

Ces deux blocs de code ci-dessous alertent foo puis bar . La seule différence est })() y }()) .

Code 1 :

(function()
{
    bar = 'bar';
    alert('foo');
})();

alert(bar);

Code 2 :

(function()
{
    bar = 'bar';
    alert('foo');
}());

alert(bar);

Y a-t-il donc une différence, hormis la syntaxe ?

59voto

SLaks Points 391154

Non, ils sont identiques.


Cependant, si vous ajoutez new à l'avance et .something après, ils seront différents.

Code 1

new (function() {
    this.prop = 4;
}) ().prop;

Ce code crée une nouvelle instance de la classe de cette fonction, puis obtient l'adresse de l'utilisateur. prop de la nouvelle instance.
Il retourne 4 .

C'est l'équivalent de

function MyClass() {
    this.prop = 4;
}
new MyClass().prop;

Code 2

new ( function() {
    return { Class: function() { } }; 
}() ).Class;

Ce code appelle new sur le Class propriété.
Comme les parenthèses de l'appel de fonction se trouvent à l'intérieur du jeu de parenthèses extérieur, elles ne sont pas prises en compte par la fonction new et, à la place, appeler la fonction normalement, en renvoyant sa valeur de retour.
Le site new L'expression est analysée jusqu'au .Class et l'instancie. (les parenthèses après new sont facultatifs)

C'est l'équivalent de

var namespace = { Class: function() { } };

function getNamespace() { return namespace; }

new ( getNamespace() ).Class;
//Or,
new namespace.Class;

Sans les parenthèses autour de l'appel à getNamespace() ce qui serait interprété comme (new getNamespace()).Class - il appelle l'instanciation de la getNamespace et retourner la classe Class de la nouvelle instance.

7voto

Alnitak Points 143355

Il n'y a pas de différence - l'accolade ouvrante sert uniquement d'indication syntaxique pour dire à l'analyseur syntaxique que ce qui suit est un fichier de type fonction expression au lieu d'un déclaration de fonction .

6voto

ThiefMaster Points 135805

Il n'y a pas de différence. Les deux sont des expressions de fonction.

Il y a aussi une troisième voie :

+function() {
    bar = 'bar';
    alert('foo');
}();

(au lieu de la + un autre opérateur fonctionnerait aussi)

Le moyen le plus courant est

(function() {
    // ...
})();

cependant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X