2012-06-18 22 views
9

Eventuali duplicati:
Difference between (function(){})(); and function(){}();funzioni self-executing

Sto cercando di capire alcune delle caratteristiche di JavaScript un po 'meglio. In The Definitive JavaScript si dice che le funzioni di self-executing dovrebbero avere parentesi tonde loro in questo modo:

var obj = (function() { 
    var value = 0; 

    return { 
     increment: function(inc) { 
      value += typeof inc === "number" ? inc : 1; 
     }, 
     getValue: function() { 
      return value; 
     } 
    } 
})(); 

ma in JavaScript - The Good Parts in cui questo esempio è tratto da, ha la funzione di cui sopra self-executing senza le parentesi tonde, in questo modo:

var obj = function() { 
    var value = 0; 

    return { 
     increment: function(inc) { 
      value += typeof inc === "number" ? inc : 1; 
     }, 
     getValue: function() { 
      return value; 
     } 
    } 
}(); 

Entrambi questi esempi lavoro per me, ma volevo chiedere se ci fossero differenze di funzionalità che avrei dovuto essere a conoscenza. Spero che questo non sia troppo banale. Volevo solo essere sicuro.

Grazie mille.

Edit:

Come Rob W ha sottolineato, c'è un altro filo sull'argomento. This is an excellent blog regarding this issue a cui era collegato l'altro post.

+4

In questo caso, entrambi sono equivalenti. Quando ometti 'var obj =', quest'ultimo genera un errore. Quindi, attenersi alla # 1, a meno che i byte diventino costosi. –

+0

Grazie mille Rob. Mi interessa solo sapere: in quali situazioni dovrei omettere 'var obj ='? Ciò restituirebbe l'oggetto all'oggetto di livello superiore, vero? Saluti. – Joe

+1

@Joe dovresti omettere 'var obj' se vuoi che la funzione venga eseguita (cioè vuoi i suoi effetti collaterali) ma non restituisce alcun valore, o non ti interessa quale sia il suo valore di ritorno. – Alnitak

risposta

13

Non c'è alcuna differenza in questo caso, ma soloperché è prefisso:

var obj = ... 

Senza che, solo la prima versione è corretta, perché è necessario le parentesi aggiuntive per consentire l'interprete per analizzare correttamente l'function come funzione espressione e non come una funzione dichiarazione.

Si potrebbe naturalmente omettere solo var obj se desideri solo la funzione di eseguire (vale a dire che si desidera i suoi effetti collaterali), ma entrambi non restituisce alcun valore, o non ti importa quello che il suo valore di ritorno è.

1

Non ci sono, in questo esempio, differenze funzionali, ma penso che le parentesi renderanno molto più leggibile. Come fai a sapere come viene definito senza i parens? È issato? This is a brilliant thread sull'argomento.

da parte:

JSLint si lamentano che ". Le dichiarazioni di funzione non sono invocabile Avvolgere la funzione intera invocazione in parentesi" Penso che la maggior parte dei parser del browser che non funzionano in modalità strict in genere lo lascino passare, ma è meglio non fare affidamento su questo.

3

JavaScript: le parti buone è stato scritto da Doug Crockford, che ha aggiornato il suo esempio per assomigliare a questo:

var obj = (function() { 
    var value = 0; 

    return { 
     increment: function(inc) { 
      value += typeof inc === "number" ? inc : 1; 
     }, 
     getValue: function() { 
      return value; 
     } 
    }; 
}()); 

Così l'intera espressione è all'interno delle parentesi.

L'idea delle parentesi esterne, che non sono necessarie, è che rende chiaro agli sviluppatori che si tratta di una funzione intenzionalmente auto-eseguita. Quindi il valore è leggibilità.