2009-04-15 10 views

risposta

14

Javascript non ha un ambito di blocco, quindi questo è un modo per creare un ambito locale temporaneo che non inquina lo spazio dei nomi globale. Le parentesi hanno due scopi:

  1. Alcune implementazioni di javascript si aprono se mancano.
  2. Segnala ai lettori che sta accadendo qualcosa di diverso da una normale dichiarazione di funzione. Quindi, come convenzione, segnala che questa funzione viene utilizzata come ambito.

vedere qui: http://peter.michaux.ca/articles/an-important-pair-of-parens

+0

mi ha battuto su di esso +1 –

6

In Safari 4, il seguente codice (senza parentesi) genera "Errore Syntax: errore Parse":

function() { alert("Test"); }(); 

... ma il seguente codice funziona come previsto:

(function() { alert("Test"); })(); 

Aggiornamento: Ho anche provato il codice di Firefox 3 (via Firebug), e si comportava proprio come Safari.

0

Per quanto ne so, l'unica differenza è che a volte quest'ultimo non funziona in alcuni tipi di ECMAScript (ovvero ActionScript, ma potrebbero essercene altri).

2

La ragione

function() { return val;}(); 

non funziona è perché si tratta di una funzione dichiarazione, non un espressione. È una distinzione piuttosto piccola, ma fondamentalmente, se la dichiarazione inizia con function, è proprio come una dichiarazione di funzione C, e non è possibile chiamare la funzione, perché non c'è alcun valore di espressione.

L'aggiunta delle parentesi rende la funzione definizione parte di un'espressione, quindi ha un valore e può essere richiamata.

L'assegnazione del valore di ritorno della funzione elimina anche la necessità di parentesi, poiché la definizione della funzione non è l'intera istruzione. Ad esempio, questi funzionano:

var value = function() { alert("works"); return 0; }(); 
(function() { alert("works"); })(); 

ma questo non lo fa:

function() { alert("doesn't work"); }(); 

ho sempre includere le parentesi, anche quando non sono necessari perché rende più facile vedere che io sono chiamando la funzione, invece di assegnarla a una variabile.

+0

Assolutamente giusto. Vedi anche qui: http://yura.thinkweb2.com/named-function-expressions/#expr-vs-decl – user123444555621

Problemi correlati