it-swarm.it

Punto e virgola prima della funzione auto-invocante?

Qual è il vantaggio dell'uso del punto e virgola prima di una funzione auto-invocante in JavaScript. Ho visto questo approccio in alcuni popolari plugin jQuery e sono curioso di scoprire se questa è la prossima cosa fantastica in JavaScript che non conosco. Grazie in anticipo, ragazzi!

97
7elephant

Se si concatenano due file con funzioni auto-invocanti che sembrano così:

File A:

(function(){...A...})()

File B:

(function(){...B...})()

File A + B:

(function(){...A...})()(function(){...B...})()

Hai due affermazioni senza separatore. Questo accade quando si cat insieme file e quindi li minimizza.

Ora l'autore del file B mette un punto e virgola in primo piano:

File B2:

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

E otterrai uno script funzionante:

(function(){...A...})();(function(){...B2...})()
160
amoebe

Le funzioni auto-invocanti sono racchiuse tra parentesi e in JavaScript le parentesi sono sovraccaricate

  1. Raggruppare le espressioni per sovrascrivere la precedenza: (x + y) * z
  2. Applicazione delle funzioni: f()

Mettere un punto e virgola prima della funzione impedisce alla funzione di diventare argomento per qualunque cosa la preceda quando le parentesi vengono confuse con l'applicazione della funzione.

Ritenere

var x = 42

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

equivale a

var x = 42(function () { ... })()

ma

var x = 42

;

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

equivale a

var x = 42;

(function () { ... })()
28
Mike Samuel

[~ # ~] i [~ # ~] scrivi tutto JavaScript in uno stile senza punti e virgola. Quando si scrive senza punti e virgola alla fine di ogni riga, a causa dell'inserimento automatico del punto e virgola (ASI), ci sono alcuni casi speciali che possono "confondere" all'inizio:

  1. Avvio di un'espressione di livello superiore con un operatore , un ( (parentesi aperta) in questo caso, che come la maggior parte degli altri operatori , può continuare l'espressione precedente e quindi sopprime "l'inserimento automatico di un punto e virgola". (Questo generalmente si verifica solo quando si utilizza una funzione auto-invocante.)

  2. Sto solo scherzando sul n. 2: non ce n'è uno! (Impara solo una regola e anche tu puoi goderti la vita senza punti e virgola extra ;-)

Dato che scrivo in uno stile senza punti e virgola, quindi scrivo sempre come (dove l'espressione della funzione può naturalmente estendersi su più righe):

;(FunctionExpression)()

Nel caso il mio caso non si tratta di "sicurezza" o di tentare di "rilevare un errore" (onestamente, se il tuo stile deve usare punti e virgola dimentichi un punto e virgola, quindi hai già creato l'errore altrove e scrivendo un ; all'inizio per "sicurezza" è hogwash). No; nel mio caso è fatto per coerenza con conoscenza del mio stile scelto e "sapere" che l'avvio di una riga con un operatore può continuare un'espressione da una riga precedente.

Vedi JavaScript: Inserimento punto e virgola (tutto quello che devi sapere) per i dettagli (è di gran lunga il miglior articolo che ho visto sull'argomento).

Buona codifica.

12
user166390

Per me, il punto e virgola stava causando un errore in Internet Explorer 8 (o almeno è quello che diceva IETester) e impediva il corretto funzionamento delle schede dell'interfaccia utente.

Il messaggio di errore era Invalid character in jquery.all.ui.js Line: 1. Char: 1.

Mi sono imbattuto nel punto e virgola completamente per caso. Quando ho rimosso ; Da ;(function($) ha funzionato, apparentemente senza effetti collaterali o perdita di funzionalità. Sto usando Drupal, non so se questo ha qualcosa a che fare con la questione.

3
Francis