Heim >Web-Frontend >js-Tutorial >Probleme mit dem folgenden Semikolon in JavaScript-Anweisungen
Im Folgenden finden Sie eine ausführliche Einführung in das Semikolon-Problem nach Anweisungen in JavaScript. Dieser Artikel stellt es Ihnen ausführlich vor. Freunde, die es benötigen, können darauf verweisen.
JavaScript fügt automatisch Punkte hinzu. Regel, es gibt 3
, wenn ein Zeilenumbruchzeichen vorhanden ist (einschließlich mehrzeiliger Kommentare mit Zeilenumbruchzeichen) und das nächste Wenn das Token nicht mit der vorherigen Syntax übereinstimmen kann, wird das Semikolon automatisch hinzugefügt.
Wenn } vorhanden ist und ein Semikolon fehlt, wird es ausgefüllt.
Wenn der Programmquellcode endet, wenn ein Semikolon fehlt fehlt. Es werden Semikolons hinzugefügt.
Mit meinem eigenen JS-Syntaxanalysetool JSinJS (https://github.com/kissjs/JSinJS) habe ich die gesamte JS-Syntax gefunden, die in der ersten Anweisung Marks (das) vorkommen kann ist der erste Satz von Statement), es sind insgesamt:
["debugger", "try", "throw", "switch", "Identifier", "with", "return", "break", "continue", "for", "while", "do", "if", "new", "function", "(", "{", "[", "RegularExpressionLiteral", "StringLiteral", "NumericLiteral", "BooleanLiteral", "NullLiteral", "this", "!", "~", "-", "+", "--", "++", "typeof", "void", "delete", ";", "var"]
35.
Ich habe auch alle grammatikalischen Markierungen gefunden, die vor dem Semikolon stehen können (also der letzte Satz nach dem Entfernen des Semikolons). Sie sind
["--", "++", "IdentifierName", "]", ")", "}", "RegularExpressionLiteral", "StringLiteral", "NumericLiteral", "BooleanLiteral", "NullLiteral", "Identifier", "this", "debugger", "return", "break", "continue"]
, insgesamt 17.
35*17 = 595 Kombinationen Um das Gedächtnis zu erleichtern, werde ich unten in Gruppen auf grammatikalische Mehrdeutigkeiten eingehen. (Ursprünglich habe ich Excel verwendet, um eine Tabelle zu erstellen, aber die Tabelle ist zu groß zum Posten)
Zuallererst ist die Anweisung, die mit dem folgenden Syntaxzeichen beginnt, absolut sicher und wird keine Verwechslung mit der vorherigen Zeile verursachen ohne Semikolon. Mehrdeutigkeit:
var if do while for continue break return with switch throw try debugger ;
Als nächstes gruppieren wir die grammatikalischen Mehrdeutigkeiten, die durch das Fehlen von Semikolons entstehen:
Erstens: Die beiden Operatoren ++ und -- erscheinen am Ende der vorherigen Zeile. Wenn die nächste Zeile mit Folgendem beginnt, tritt eine Syntaxmehrdeutigkeit auf:
Funktion löschen void typeof new null true false NumericLiteral StringLiteral RegularExpressionLiteral ( [ { Identifier ++ -- + - ~ !
Unter diesen sind Funktion und Löschen sehr häufig verwendete Anweisungen am Anfang.
Vor allem, wenn ++ und -- in eine einzige Zeile unterteilt sind, da die Grammatikregeln von JS vorschreiben, dass die Post-Inkrementierungsoperation das Einfügen einer neuen Zeile in der Mitte nicht zulässt, also ++ und -- werden als das vorherige Inkrement betrachtet und folgen der nächsten Zeile.
Der zweite Fall ist, wenn die nächste Zeile beginnt mit Folgendem kommt es zu grammatikalischer Mehrdeutigkeit:
function delete void typeof ( [ { Identifier ++ -- + - ~ !
Auch weil die Regeln der JS-Grammatik das Einfügen einer neuen Zeile zwischen der Rückgabe und dem folgenden Wert nicht zulassen. Solange nach der Rückgabe ein Zeilenumbruchzeichen vorhanden ist, wird davon ausgegangen, dass es ein Semikolon enthält, was häufig nicht mit den Erwartungen des Benutzers übereinstimmt.
Die dritte Situation ist, wenn die nächste Zeile mit + und - beginnt und die vorherige Zeile mit
-- ++ IdentifierName endet ] ) } RegularExpressionLiteral
da es selten gibt Die Anweisung beginnt mit + oder -, daher ist diese Situation nicht gefährlich
Die vierte Situation ist, wenn die vorherige Zeile mit „break“ oder „continue“ endet und die nächste Zeile mit „Identifier“ beginnt.
Der fünfte Typ ist, wenn die nächste Zeile mit ( und [, und Die vorherige Zeile endet mit Folgendem, es kommt zu grammatikalischer Mehrdeutigkeit:
-- ++ IdentifierName ] ) } RegularExpressionLiteral StringLiteral NumericLiteral BooleanLiteral NullLiteral Identifier this
Diese Situation ist sehr gefährlich (daher wird im Artikel von hax erwähnt, dass diese Situation vor dem Semikolon der Anweisung geschrieben werden sollte). Fast alle Fälle in der vorherigen Zeile führen zu unerwarteten Ergebnissen.
Das sechste ist, dass, wenn die nächste Zeile mit RegularExpressionLiteral beginnt, das folgende Ende der vorherigen Zeile ein Divisionszeichen verursacht/interpretiert wird:
-- ++ IdentifierName ] ) } RegularExpressionLiteral StringLiteral NumericLiteral BooleanLiteral NullLiteral Identifier this
Zusammenfassung,
In den fünf Anweisungen Return, Break, Continue, Post-Inkrement und Post-Dekrement kann das Newline-Zeichen das Semikolon vollständig ersetzen.
var if do while for continue break return with switch throw try debugger Mehrere Schlüsselwortanweisungen sowie leere Anweisungen, das Hinzufügen eines Semikolons in der vorherigen Zeile oder kein Semikolon hat nur geringe Auswirkungen.
Es ist sehr gefährlich, nach einer Ausdrucksanweisung oder Funktionsausdrucksanweisung kein Semikolon einzufügen, und die Situation ist äußerst kompliziert.
Jede Aussage, die mit ( und [ ohne ein Semikolon davor beginnt, ist äußerst gefährlich.
Die folgenden Beispiele sind bestanden Code-Einführung in das Semikolon-Problem in JavaScript
Im Allgemeinen stoßen faule Front-End-Programmierer oft auf einige unerklärliche Probleme
Heute werden wir nur auf einige davon eingehen Probleme mit Semikolons in JS, da die Kompilierung fehlschlägt, wenn nach dem Zeilenumbruchzeichen ein Semikolon fehlt. In einigen bestimmten Fällen wird jedoch standardmäßig kein Semikolon hinzugefügt . Lassen Sie uns nun kurz ein paar Dinge vorstellen, die Sie beachten sollten:
In diesem Fall:
var x = 0 [x+1,x+2,x+3].forEach(function(){ console.log(x) })
这种情况下会导致程序无法正常运行。JavaScript在解析这段代码是并不会在var x = 0后换行。
在写代码时如果以一条语句以 ”(” ,"[" ,"+" ,"-" ,"/" 开始时通常在上一条语句不会默认添加分号的。所以在这种情况下尽量保持一下这种写法,在以这些字符开始时在行首添加一个分号,这样可以保证在别人更改上面代码时不加分号也不会影响以下代码运行。
var x = 0 ;[x+1,x+2,x+3].forEach(function(){ console.log(x) })
还有就是在涉及 return break continue 这种语句时尽量不要换行
return true; JavaScript会解析为 return; true; 在涉及 ++ 和 -- 这一系列运算时 在作为表达式的前缀或后缀时在换行是会有一定的问题,如下情况: var x = 0; var y = 0; x ++ y
JavaScript会解析为
x;++y; 而不是 x++;y;
虽然在JavaScript这门语言中 “;” 是可以省略不写的,但是还是建议大家每句代码后都跟上 “;” 养成这种良好的编码习惯,毕竟在大多语言中不带 “;” 的编码适不适用的。
上面是我整理给大家的,希望今后会对大家有帮助。
相关文章:
Das obige ist der detaillierte Inhalt vonProbleme mit dem folgenden Semikolon in JavaScript-Anweisungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!