2010-09-23 20 views
21

Eventuali duplicati:
Location of parenthesis for auto-executing anonymous JavaScript functions?C'è una differenza tra (function() {...}()); e (function() {...})() ;?

A volte vedo:

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

ea volte vedo:

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

I vedere entrambe le forme con e senza argomenti. Essi bothexecute la funzione anonima.

C'è una differenza tra le due forme? Ci sono motivi validi per utilizzare un modulo rispetto all'altro?

+0

@ Tim - Grazie per aver indicato quel thread. Non l'ho trovato con la ricerca. –

+0

Continuiamo a votare un duplicato ... –

+2

Josh: La risposta del CMS è migliore di quella del duplicato, quindi ne è derivata una buona parte. –

risposta

32

Non v'è alcuna differenza pratica in quei due forme, ma da un grammaticale punto di vista della differenza tra i due è che The Grouping Operator - le parentesi - terrà nel primo esempio di un CallExpression, che include il FunctionExpression:

 
       CallExpression 
       |   | 
     FunctionExpression | 
       |   | 
       V   V 
    (function() {  }()); 
    ^     ^
    |--PrimaryExpression --| 

Nel secondo esempio, abbiamo prima un intero CallExpression, che detiene il FunctionExpression:

 
      PrimaryExpression 
       | 
     FunctionExpression 
       | 
       V 
    (function() {  })(); 
    ^     ^
    |-- CallExpression --| 

5

Non esiste alcuna differenza tra i due, per quanto riguarda il compilatore. Tuttavia, troverà che lo stile (function() {}()) è consigliato in JavaScript code conventions di Douglas Crockford.

+0

Correzione: (function() {}()); – Moses

+1

Come ha scritto Moses, sembra che sia il contrario.Da quel testo: 'Quando una funzione deve essere richiamata immediatamente, l'intera espressione di invocazione deve essere racchiusa in parens in modo che sia chiaro che il valore prodotto è il risultato della funzione e non la funzione stessa. (function() {...}()); ' –

+3

Per essere ancora più chiaro, Crockford non raccomanda (esplicitamente) alcun modulo in quel collegamento. L'unica cosa correlata raccomandata da Crockford è il wrapping delle funzioni autoeseguibili in Parens. – Moses

2

Per quanto riguarda le differenze, è davvero solo zucchero sintattico. Un po 'equivalente a: "ti piace jQuery() o $()?" Entrambi possono essere compilati, eseguiti e utilizzati in modo intercambiabile (AFAIK).

Dagli esempi di codice che ho visto finora, sempre più persone sembrano seguire il codice convenzione Crockford:

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

Personalmente, preferisco la convenzione (function(){})(); perché è più evidente per me che la funzione è auto -executing; Sono anche un grande utente di jQuery e questa è la convenzione utilizzata in jQuery source.

Inoltre, è consigliabile utilizzare Parens per includere la funzione autoeseguibile, indipendentemente dalla forma con cui si sceglie di andare.

+0

Esiste una fonte per la "convenzione predominante"? –

+0

@Casey - Crockford lo menziona nel suo [** codice convenzioni **] (http://javascript.crockford.com/code.html) - [Mozilla] (https://developer.mozilla.org/en/JavaScript_style_guide) e le convenzioni [Drupal] (http://drupal.org/node/172169) non sembrano menzionarlo in alcun modo. –

Problemi correlati