In Kapitel 7.7 (Punctuators) der ECMAScript-Spezifikation ( Ссылка ) Das Raster der Interpunktionszeichen scheint eine Lücke in Zeile 3 der letzten Spalte zu haben. Dies ist in der Tat das Leerzeichen Interpunktion, richtig?
Ich verstehe, dass Leerzeichen zwischen den Token im JavaScript-Code optional eingefügt werden können (um die Lesbarkeit zu verbessern), aber ich frage mich, wo sie eigentlich erforderlich sind ...
Um das herauszufinden, habe ich in der verkleinerten Version der jQuery-Bibliothek nach Leerzeichen gesucht. Das sind meine Ergebnisse:
Ein Leerzeichen ist erforderlich ... (siehe Update unten)
... zwischen einem Schlüsselwort und einem Bezeichner:
%Vor%... zwischen zwei Schlüsselwörtern:
%Vor%Dies sind die zwei Fälle, die ich identifiziert habe. Gibt es noch andere Fälle?
Hinweis: Leerzeichen in Zeichenfolgenliteralen werden (offensichtlich) nicht als Zeichen für Trennzeichen betrachtet.
Update: Wie sich herausstellt, ist in diesen Fällen ein Leerzeichen in nicht erforderlich. Zum Beispiel müssen ein Schlüsselwort-Token und ein Bezeichner-Token durch etwas getrennt sein, aber das etwas muss kein Leerzeichen sein. Dies kann ein beliebiges Eingabeelement sein, das kein Token ist ( WhiteSpace
, LineTerminator
oder Comment
).
Auch ... Es scheint, dass das Leerzeichen als WhiteSpace
-Eingabeelement und nicht als ein Token betrachtet wird, was bedeutet, dass Es ist kein Interpunktionszeichen .
Whitespaces sind in keinem dieser Fälle nicht erforderlich. Sie müssen nur eine Syntax schreiben, die für den Parser verständlich ist. Mit anderen Worten: Die Maschine muss wissen, ob Sie ein Schlüsselwort wie function
oder new
verwenden oder nur eine andere Variable wie newFunction
definieren.
Jedes Schlüsselwort muss irgendwie abgegrenzt werden - Leerzeichen sind am sinnvollsten und lesbar, aber sie können ersetzt werden:
%Vor%Ich glaube nicht, dass diese Lücke ein Raum sein soll, nein, ich denke, es ist nur eine Lücke (eine unglückliche). Wenn sie wirklich beabsichtigen, einen Bereich aufzulisten, erwarte ich, dass sie " Whitespace " wie an anderer Stelle im Dokument verwenden. Aber Leerzeichen als Punctuator macht keinen Sinn.
Ich glaube, dass Leerzeichen (und andere Formen von Leerzeichen) Trennzeichen sind. Die Spezifikationsart definiert sie durch Unterlassung und nicht explizit. Der Platz wird zwischen function
und x
benötigt, weil Sie ansonsten das Token functionx
haben, was natürlich kein Schlüsselwort ist (obwohl es ein Name Token sein könnte - zB eine Variable, eine Eigenschaft oder ein Funktionsname).
Sie benötigen Trennzeichen um einige Token ( Bezeichner und Reservierte Wörter ), denn so erkennen wir, wo diese Token beginnen und enden - ein BezeichnerName beginnt mit einem IdentifierStart , gefolgt von null oder mehr IdentifierParts , einer Klasse, die keine Leerzeichen oder Zeichen für Interpunktionszeichen enthält. Andere Tokens ( Punctuators zum Beispiel) können wir ohne Begrenzer erkennen. Ich denke, das ist alles, und so sind Ihre beiden Regeln nur zwei Beispiele für die gleiche Regel: IdentifierNames müssen durch Leerzeichen getrennt werden, durch Leerzeichen, durch Anfang oder Ende der Datei, ... ).
Etwas außerhalb des Themas, aber natürlich sind nicht alle Trennzeichen gleich. Line-breaking Trennzeichen werden manchmal speziell von der Grammatik für den Horror, der "Semikolon-Insertion" ist behandelt.
Das ist nur eine Vermutung, aber ich würde sagen, dass Räume nirgendwo wirklich benötigt werden. Sie werden nur als eine von vielen Alternativen verwendet, um Wortgrenzen zwischen Stichwörtern zu generieren. Das heißt, Sie könnten sie genauso gut durch andere ersetzen.
Wenn Sie die unnötigen Leerzeichen aus irgendeinem Code entfernen möchten, würde ich sagen, dass Leerzeichen (genauer gesagt Leerzeichen, Tabs funktionieren genauso) nur dort verpflichtend sind, wo es keine andere Möglichkeit gibt, Schlüsselwörter zu trennen / oder variable Bezeichner. I.e. Wenn Sie den Leerraum entfernen, haben Sie nicht mehr die gleichen Schlüsselwörter und Bezeichner im resultierenden Code.
Was folgt, ist nicht gerade relevant für Ihre Bedürfnisse, aber Sie können es interessant finden. Sie können Ihnen Beispiele schreiben, so dass sie diese Leerzeichen nicht mehr haben. Ich hoffe, keines der Beispiele ist falsch.
x=function(){}
anstelle von function x(){}
this.x=null;
anstelle von var x;
return(x);
anstelle von return x;
typeof(x);
anstelle von typeof x;
y=X();
anstelle von y = new X();
return(false)
anstelle von return false
if(x){}else{if(y){}else{}}
anstelle von if(x){}else if(y){}else{}
Tags und Links javascript