Automatic semicolon insertionAutomatic semicolon insertion (englisch für automatische Semikolon-Einfügung, kurz ASI) bezeichnet ein Verhalten des JavaScript-Parsers. Die meisten Anweisungen in JavaScript werden durch ein Semikolon abgeschlossen. In vielen Fällen muss dieses Semikolon jedoch nicht explizit im Quelltext angegeben werden, da es der Parser von sich aus ergänzt. Das Verhalten ist umstritten, da es einerseits das Programmieren erleichtert, indem viele Semikola ausgelassen werden können, andererseits in Spezialfällen zu unerwartetem Verhalten und damit zu schwer zu entdeckenden Programmierfehlern führen kann. DefinitionDie automatic semicolon insertion ist im ECMAScript-Standard festgelegt und gilt damit neben JavaScript auch für ActionScript. In den folgenden Fällen fügt der Parser automatisch ein Semikolon ein:[1]
Das Semikolon wird vor dem unerwarteten Token bzw. vor dem Ende des Quelltextes eingefügt. Ein Semikolon, das nach diesen Regeln automatisch eingefügt würde, wird dennoch nicht eingefügt, falls einer der beiden folgenden Fälle zutrifft:
DetailsBei einzeiligen Kommentaren gehört der Zeilenumbruch, der den Kommentar abschließt nicht zum Kommentar dazu, stellt also einen Zeilenumbruch im Sinne der obigen Regeln dar. Mehrzeilige Kommentare werden ebenfalls wie Zeilenumbrüche behandelt. Das eingefügte Semikolon steht nach dem Zeilenumbruch, während ein explizit angegebenes Semikolon meist ans Ende der Zeile gesetzt wird; dies macht jedoch für den Parser keinen Unterschied. Die Anweisungen, in denen ein Zeilenumbruch verboten ist, sind die Postinkrement- und -dekrementoperatoren, BeispieleIn den folgenden Beispielen stehen Der Normalfall, für den die automatic semicolon insertion gedacht ist, zeigt sich im folgenden Code: { foo()
bar() } baz()
Dies widerspricht eigentlich der Syntax von ECMAScript, wird aber durch das automatische Einfügen von Semikola zu folgendem korrektem Code: { foo()
;bar() ;} baz();
In folgendem Code wird kein Semikolon ergänzt: a = b
+ c
+ d;
Der Code ist nämlich gültig, ohne dass bei den Zeilenumbrüchen Semikola ergänzt werden. Dies erlaubt es, lange Codezeilen auf mehrere Zeilen zu verteilen. In einigen Fällen führt das Weglassen von Semikola zu Syntaxfehlern, wenn diese nicht wie erwartet ergänzt werden: if (a > b)
else c = d
Hier wird nach der ersten Zeile kein Semikolon ergänzt, da dieses eine leere Anweisung ergeben würde. Damit verursacht das Ein problematisches Verhalten der automatic semicolon insertion zeigt sich im folgenden Beispiel: return
a + b;
Da direkt nach return;
a + b;
Statt der Summe return a
+ b;
Ein ähnlich unerwarteter Fehler entspringt dem folgenden Code: a = b + c
(c + d).print()
Hier sollte eigentlich in zwei Anweisungen zunächst die Summe a = b + c(c + d).print();
Es wird also versucht BewertungDouglas Crockford bezeichnet die automatic semicolon insertion als einen „furchtbaren Designfehler“ von JavaScript und empfiehlt von wenigen Ausnahmen abgesehen, das Semikolon immer explizit anzugeben.[2] JSLint und ähnliche Hilfsmittel zur Stilkontrolle warnen in der Regel, wenn ein Semikolon automatisch eingefügt würde. Auf der anderen Seite gibt es auch Programmierer, die die automatic semicolon insertion gerne nutzen. Um unerwartete Fehler zu vermeiden können Zeilen, die mit einer Klammer oder einem regulären Ausdruck beginnen, ein Semikolon vorangestellt werden.[3] So wird vermieden, dass nach dem Verschieben von Codezeilen an eine andere Stelle ein ursprünglich explizit gesetztes Semikolon nicht mehr an der notwendigen Stelle steht. Einzelnachweise
|
Portal di Ensiklopedia Dunia