Perché dovrei usare un punto e virgola dopo ogni funzione in JavaScript?


282

Ho visto diversi sviluppatori includere punti e virgola dopo le funzioni in JavaScript e alcuni no. Qual è la migliore pratica?

function weLikeSemiColons(arg) {
   // bunch of code
};

o

function unnecessary(arg) {
  // bunch of code
}

Risposte:


424

I punti e virgola dopo le dichiarazioni di funzione non sono necessari .

La grammatica di a FunctionDeclarationè descritta nelle specifiche come questa:

function Identifier ( FormalParameterListopt ) { FunctionBody }

Non è necessario un punto e virgola grammaticalmente richiesto, ma potresti chiederti perché?

I punti e virgola servono per separare le dichiarazioni l' una dall'altra e a FunctionDeclarationnon è una dichiarazione .

FunctionDeclarationsvengono valutati prima che il codice entri in esecuzione, il sollevamento è una parola comune utilizzata per spiegare questo comportamento.

I termini "dichiarazione di funzione" e "istruzione di funzione" sono spesso usati erroneamente in modo intercambiabile, poiché non vi è alcuna istruzione di funzione descritta nella specifica ECMAScript, tuttavia ci sono alcune implementazioni che includono un'istruzione di funzione nella loro grammatica, - in particolare Mozilla - ma ancora questo non è standard.

Tuttavia, i punti e virgola sono sempre consigliati dove si utilizza FunctionExpressions, ad esempio:

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

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

Se si omette il punto e virgola dopo la prima funzione nell'esempio precedente, si otterranno risultati completamente indesiderati:

var myFn = function () {
  alert("Surprise!");
} // <-- No semicolon!

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

La prima funzione verrà eseguita immediatamente, poiché le parentesi che circondano la seconda, verranno interpretate come la Argumentschiamata di una funzione.

Lezioni consigliate:


2
Modificato per chiarire, l'articolo parla di espressioni di funzioni
CMS

1
Non ho familiarità con l'ECMA, ma questo è anche lo standard che uso. Buon post. La maggior parte dei tutorial che vedo online e esempi di codice I DL usano quello standard, quindi mi sono appena adattato.
regex,

1
Parte della confusione qui potrebbe essere influenzata dalla mancanza di una buona parola inglese per "permesso perché sarà ignorato". Riteniamo di dire "facoltativo", ma è fuorviante poiché suggerisce che non includere un punto e virgola dopo una dichiarazione rientra nella stessa categoria del non includere un punto e virgola dopo una dichiarazione. Quest'ultimo è facoltativo in un senso completamente diverso: è perché il parser aggiungerà il punto e virgola mancante che hai omesso , mentre in questo caso, è perché il parser ignorerà il punto e virgola che hai incluso . Per dirla in altro modo: se uno è facoltativo, lo sono anche otto .
Punto

Il link "Espressioni di funzioni nominate demistificate" si collega ora a un URL morto, l'archivio web ne ha una copia qui: web.archive.org/web/20100426173335/http://yura.thinkweb2.com/…
Tony

L'ultimo esempio è fantastico. Omettere un punto e virgola in questo caso porta a bug estremamente strani e difficili da debug. Votazione con tutto il cuore.
Yan Yankowski il

38

Li uso dopo dichiarazioni di funzione come variabile:

var f = function() { ... };

ma non dopo le definizioni in stile classico:

function f() {
    ...
}

A NetBeans, così come ad altri IDE piace vedere i punti e virgola dopo una funzione come variabile come this.animaton_fun = function () {...};
Lance Cleveland,

6
Ma - per l'interrogante - perché ?
Luca,

aiuta durante la fase di compilazione. Quando uno script uglifier vede un punto e virgola, non è necessario aggiungere un'interruzione di riga al file di output, in caso contrario verrà generata un'interruzione di riga e il file sarà leggermente più grande.
Autoboxer,

20

JS Lint è una convenzione di fatto e non dice punto e virgola dopo il corpo della funzione. Vedi la sezione "Punto e virgola" .


10
Ho assistito in prima persona a una funzione non riuscita a causa della mancanza del punto e virgola. Sono completamente in disaccordo sul fatto che lasciarlo fuori sia una convenzione. Mentre il 99,99% delle volte non si rompe, ci sono alcune situazioni in cui ho notato che IE non è stato in grado di interpetare JavaScript senza il punto e virgola.
MillsJROSS,

8
La mia risposta riguarda solo le definizioni delle funzioni come nei due esempi della domanda. In questi casi, non è necessario un punto e virgola in nessun browser, in nessuna situazione. Immagino che potresti pensare alle espressioni di funzione. Sono una questione completamente diversa, e non quella che è stata affrontata nella domanda originale.
David Hedlund,

var myFunction = function (arg) {console.log (arg); } (function () {console.log ('funzione completamente non correlata'); return 'guarda cosa succede';} ());
Maciej Krawczyk,

@MillsJROSS Secondo la risposta di David, e sarei felice se elaborassi il fallimento che hai riscontrato. Era davvero un'espressione di funzione o un bug di IE?
wlnirvana,

7

Rimani coerente! Non sono necessari, ma li uso personalmente perché la maggior parte delle tecniche di minificazione si basano sul punto e virgola (ad esempio Packer ).


5

Dipende solo dalle tue preferenze. Mi piace terminare le righe di codice con punti e virgola perché sono abituato a Java, C ++, C #, ecc., Quindi uso gli stessi standard per la codifica in JavaScript.

Tuttavia, in genere non termino le dichiarazioni di funzione tra punti e virgola, ma questa è solo la mia preferenza.

I browser funzioneranno in entrambi i modi, ma forse un giorno escogiteranno alcuni standard più severi che lo governano.

Esempio di codice che scriverei:

function handleClickEvent(e)
{
     // comment
     var something = true;  // line of code
     if (something)  // code block
     {
        doSomething();  // function call
     }
}

1
le righe dovrebbero essere definitivamente terminate con punto e virgola, comunque. altrimenti un minificatore potrebbe interrompere completamente la funzionalità
David Hedlund,

9
@david: in tal caso il minificatore è rotto, sicuramente?
DisgruntledGoat

Concordato. È un modo naturale di codifica per persone (come me) provenienti da sfondi C / C ++. Inoltre rende il codice più leggibile.
Anshuman Manral il

3

In realtà è più di un problema di convenzione o coerenza.

Sono abbastanza certo che non posizionare i punti e virgola dopo ogni istruzione rallenta il parser interno perché deve capire dove si trova la fine dell'istruzione. Vorrei avere alcuni numeri utili per confermarlo positivamente, ma forse puoi cercarlo tu stesso. :)

Inoltre, quando si comprime o si minimizza il codice, la mancanza di punti e virgola può portare a una versione ridotta dello script che non fa ciò che si desidera perché tutto lo spazio bianco scompare.


3
La domanda era rivolta a se i punti e virgola dovevano essere dopo funzioni, non tutte le affermazioni. Sono d'accordo che dovresti inserire i punti e virgola dopo ogni affermazione e ho visto altri consensi di stackover dire lo stesso.
macca1,

1
Concordato e non riuscire a mettere i punti e virgola dopo le funzioni comporterà quel problema di minificazione che ho citato. Buona fortuna signore
Mason,

Il voto perché il rafforzamento del problema di minificazione ha chiarito la mia comprensione
JackW327,

1

Quando ho minimizzato i miei script mi ​​sono reso conto che ho bisogno di usare il punto e virgola per le funzioni che iniziano con il segno di uguale. se si definisce una funzione come var, sì, è necessario utilizzare il punto e virgola.

bisogno di punto e virgola

var x = function(){};
var x = new function(){};
this.x = function(){};

non è necessario il punto e virgola

function x(){}

0

SEMPLICE:

È buona norma lasciare i punti e virgola ;dopo la fine delle parentesi graffe della funzione. Sono stati considerati le migliori pratiche per anni.

Un vantaggio di usarli sempre è se vuoi minimizzare il tuo JavaScript.

Come minimizzare Javascript, aiuta a ridurre un po 'le dimensioni del file.

Ma per quanto riguarda la best practice e la risposta sopra, non è consigliabile utilizzarlo dopo un tag di funzione.

Se NON usi i punti e virgola e se vuoi minimizzare (come piace a molti sviluppatori se il loro sito serve molto JavaScript) potresti ricevere tutti i tipi di errori / avvisi.


0

il punto e virgola dopo una funzione non è necessario utilizzarla o meno, non causa errori nel programma. tuttavia, se prevedi di minimizzare il codice, è consigliabile utilizzare i punti e virgola dopo le funzioni. ad esempio, hai un codice come quello qui sotto

//file one
var one=1;
var two=2;
function tryOne(){}
function trytwo(){}

e

//file two
var one=1;
var two=2;
function tryOne(){};
function trytwo(){};

quando minimizzi entrambi, otterrai quanto segue come output

Nota che i commenti sono solo a scopo illustrativo

//file one
var one=1;var two=2;function tryOne(){}
function trytwo(){}

e

//file two
var one=1;var two=2;function tryOne(){};function trytwo(){};
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.