Ricerca…
Regole di inserimento automatico punto e virgola
Esistono tre regole base per l'inserimento del punto e virgola:
- Quando, mentre il programma viene analizzato da sinistra a destra, viene rilevato un token (chiamato token offendente ) non consentito da alcuna produzione della grammatica, quindi viene inserito automaticamente un punto e virgola prima del token offendente se uno o più dei seguenti le condizioni sono vere:
- Il token incriminato è separato dal token precedente da almeno un
LineTerminator
.- Il token incriminato è
}
.
- Quando il programma viene analizzato da sinistra a destra, viene rilevata la fine del flusso di input dei token e il parser non è in grado di analizzare il flusso di token di input come un singolo
Program
ECMAScript completo, quindi un punto e virgola viene inserito automaticamente alla fine di il flusso di input.- Quando, come il programma viene analizzato da sinistra a destra, viene rilevato un token che è consentito da alcune produzioni della grammatica, ma la produzione è una produzione limitata e il token sarebbe il primo token per un terminale o non terminale che segue immediatamente l'annotazione " [nessun
LineTerminator
qui] " all'interno della produzione limitata (e quindi tale token è chiamato token limitato) e il token limitato viene separato dal token precedente da almeno unLineTerminator
, quindi un punto e virgola viene inserito automaticamente prima del token limitato .Tuttavia, esiste una condizione di override aggiuntiva sulle regole precedenti: un punto e virgola non viene mai inserito automaticamente se il punto e virgola viene analizzato come un'istruzione vuota o se tale punto e virgola diventa uno dei due punti e virgola nell'intestazione di un'istruzione
for
(vedere 12.6.3).
Fonte: ECMA-262, Fifth Edition Specifica ECMAScript:
Dichiarazioni interessate dall'inserimento automatico del punto e virgola
- dichiarazione vuota
- dichiarazione
var
- espressione
- dichiarazione
do-while
-
continue
dichiarazione - dichiarazione di
break
- dichiarazione di
return
-
throw
dichiarazione
Esempi:
Quando viene incontrata la fine del flusso di input dei token e il parser non è in grado di analizzare il flusso di token di input come un singolo programma completo, un punto e virgola viene automaticamente inserito alla fine del flusso di input.
a = b
++c
// is transformed to:
a = b;
++c;
x
++
y
// is transformed to:
x;
++y;
Indicizzazione / letterali di matrice
console.log("Hello, World")
[1,2,3].join()
// is transformed to:
console.log("Hello, World")[(1, 2, 3)].join();
Dichiarazione di ritorno:
return
"something";
// is transformed to
return;
"something";
Evita l'inserimento del punto e virgola nelle dichiarazioni di reso
La convenzione di codifica JavaScript prevede di posizionare la parentesi iniziale dei blocchi sulla stessa riga della loro dichiarazione:
if (...) {
}
function (a, b, ...) {
}
Invece della riga successiva:
if (...)
{
}
function (a, b, ...)
{
}
Questo è stato adottato per evitare l'inserimento del punto e virgola nelle istruzioni di ritorno che restituiscono oggetti:
function foo()
{
return // A semicolon will be inserted here, making the function return nothing
{
foo: 'foo'
};
}
foo(); // undefined
function properFoo() {
return {
foo: 'foo'
};
}
properFoo(); // { foo: 'foo' }
Nella maggior parte delle lingue il posizionamento della parentesi di partenza è solo una questione di preferenze personali, in quanto non ha alcun impatto reale sull'esecuzione del codice. In JavaScript, come hai visto, posizionare la parentesi iniziale nella riga successiva può portare a errori silenziosi.