Are “(function () {}) ()” e “(function () {} ())” sono funzionalmente uguali in JavaScript?

Entrambi questi blocchi di codice si trovano sotto l’avviso foo quindi bar . L’unica differenza è })() e }()) .

Codice 1:

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

Codice 2:

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

Quindi c’è qualche differenza, a parte la syntax?

No; sono identici


Tuttavia, se aggiungi in anticipo un new e .something seguito, saranno diversi.

Codice 1

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

Questo codice crea una nuova istanza della class di questa funzione, quindi ottiene la proprietà prop della nuova istanza.
Restituisce 4 .

È equivalente a

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

Codice 2

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

Questo codice chiama new sulla proprietà Class .
Poiché le parentesi per la chiamata di funzione si trovano all’interno del gruppo esterno di parentesi, non vengono rilevate dalla new espressione e chiamano normalmente la funzione, restituendo il valore restituito.
La new espressione analizza fino alla .Class e la crea un’istanza. (le parentesi dopo il new sono opzionali)

È equivalente a

 var namespace = { Class: function() { } }; function getNamespace() { return namespace; } new ( getNamespace() ).Class; //Or, new namespace.Class; 

Senza le parentesi attorno alla chiamata a getNamespace() , questo sarebbe analizzato come (new getNamespace()).Class – chiamerebbe istanziare la class getNamespace e restituire la proprietà Class della nuova istanza.

Non c’è alcuna differenza – la parentesi graffa di apertura serve solo come suggerimento sintattico per dire al parser che quanto segue è un’espressione di funzione invece di una dichiarazione di funzione .

Non c’è alcuna differenza. Entrambe sono espressioni di funzione.

C’è anche una terza via:

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

(invece del + un altro operatore avrebbe funzionato, anche)

Il modo più comune è

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

anche se.