Sintassi di chiamata di funzione immediata

C’è un’opzione JSLint , una delle parti buone in effetti, che “[richiede] parve intorno a invocazioni immediate”, il che significa che la costruzione

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

dovrebbe invece essere scritto come

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

La mia domanda è questa: qualcuno può spiegare perché questa seconda forma potrebbe essere considerata migliore? È più resiliente? Meno incline agli errori? Che vantaggio ha sul primo modulo?


Da quando ho fatto questa domanda, ho capito l’importanza di avere una chiara distinzione visiva tra i valori delle funzioni e i valori delle funzioni. Considera il caso in cui il risultato dell’invocazione immediata è il lato destro di un’espressione di assegnazione:

 var someVar = (function () { // ... }()); 

Sebbene le parentesi più esterne siano sintatticamente non necessarie, la parentesi di apertura dà un’indicazione anticipata che il valore assegnato non è la funzione stessa, ma piuttosto il risultato della funzione invocata.

Questo è simile al consiglio di Crockford in merito alla capitalizzazione delle funzioni di costruzione – è pensato per fungere da segnale visivo per chiunque stia guardando il codice sorgente.

Dalla guida alla convention in stile di Douglass Crockford: (cerca “invocato immediatamente”)

Quando una funzione deve essere invocata immediatamente, l’intera espressione di invocazione deve essere racchiusa in paren in modo che sia chiaro che il valore prodotto è il risultato della funzione e non della funzione stessa.

Quindi, in sostanza, sente che rende più chiara la distinzione tra i valori delle funzioni e i valori delle funzioni. Quindi, è una questione stilistica, non una vera differenza sostanziale nel codice stesso.

riferimento aggiornato, il vecchio PPT non esiste più

Le funzioni anonime chiamate immediatamente vengono impacchettate in paren perché:

  1. Esse sono espressioni di funzione e l’eliminazione di paren fa sì che venga interpretata come una dichiarazione di funzione che è un errore di syntax.

  2. Le espressioni di funzione non possono iniziare con la funzione di parola.

  3. Quando si assegna la funzione expression a una variabile, la funzione stessa non viene restituita, viene restituito il valore di ritorno della funzione quindi i paren valutano cosa c’è dentro e producono un valore. quando la funzione viene eseguita e il trailing parens ..}() sì che la funzione venga eseguita immediatamente.

Oppure, usa:

 void function () { ... } ()