2010-09-15 6 views
6

In Javascript Ich sehe manchmal eine lange Codezeile in einem ) wie diese aufgebrochen (example):

function() 
{ 

oder so (example):

object.methodOne() 
     .methodTwo(); 

Aber beim Lesen der line break expectations for jsLint, heißt es:

, ; : { } ([ = < > ? ! + - */% ~^| & 
== != <= >= += -= *= /= %= ^= |= &= << >> || && 
=== !== <<= >>= >>> >>>= 
:

Als weitere Verteidigung gegen das Semikolon Insertionsmechanismus erwartet JSLint lange Aussagen nach einem dieser Satzzeichen oder Operatoren nur gebrochen werden

JSLint erwartet keine lange Anweisung, die nach einem Bezeichner, einer Zeichenfolge, einer Zahl, einem Closer oder einem Suffixoperator unterbrochen wurde:

.) ] ++ -- 

Also wird die enge Klammer als ein Zeilentrenner ausgesondert, den JSLint "nicht erwartet".

Ich würde es vorziehen

function() 
{ 

zu verwenden, da ich es besser lesbar zu finden, und ich habe es bereits in anderen Sprachen verwenden, aber zur Zeit verwende ich:

function() { 

Kann ich sicher die ) verwenden Lange Schlangen aufbrechen?

+0

Beachten Sie, dass jslint ist absichtlich defensiver als die tatsächliche JS-Syntax, und es wird sich über Dinge beschweren, die gültig sind Javascript (zum Beispiel jslint berücksichtigt '++' und '-' schlecht). –

+0

@Daniel - Ich verstehe das, aber ich nehme an, dass es immer noch Gründe für die Regeln gibt ... Ich bin mir nur nicht sicher, was sie im Fall der engen Paren sein könnten. –

+1

Obwohl die Funktionsdefinition zu 100% sicher ist, gibt es andere Fälle (siehe die Antwort von user166390), bei denen ein ')' am Ende Probleme verursachen könnte. – casablanca

Antwort

4

soll Dieser Link alles erklärt

Es ist fünf eingeschränkte Produktionen in der Grammatik, sind sie die Postfixoperatoren ++ und -, weiter Anweisungen, brechen Anweisungen, zurückgeben Anweisungen und werfen Anweisungen.

function() ist nicht in dieser "Gefahr" -Liste. Beim Schreiben von Semikolon-Frei-Code (ich bin mir nicht sicher, ob das dein Ziel ist :-), sollte man sich vor Zeilen schützen, die mit Zeichen beginnen - wie ( oder - die möglicherweise oder fortsetzen Ausdruck. Der folgende Code zeigt ein Beispiel-Code, der ist wahrscheinlich falsch:

x() 
(function(){...})() 

Wie Sie sehen können, ) als Leitungsschutzschalter verwendet, kann der Ausdruck der Lage machen, weiterhin auf subtile Weise ohne explizite halb- Doppelpunkt iff die nächste Zeile kann den Ausdruck fortsetzen. Ich schreibe das Verfahren als (wenn die folgende ist in der Tat die Absicht):

x() 
;(function(){...})() 

Ich persönlich mag nicht JSLint :-) Glücklich Codierung.

2

Wenn Sie versuchen, ein Objekt zurück,

return { 
'foo': 'bar' 
} 

das Objekt zurück, während

return 
{ 
    'foo': 'bar' 
} 

wird undefined zurück. Javascript wird automatisch ein Semikolon nach return im zweiten Beispiel einfügen, und das Objekt wird nie erreicht werden.

Für Funktionen, weil function() nicht allein gültig ist, sollte es keinen Unterschied machen, ob die Klammer in der gleichen Zeile oder der nächsten Zeile ist.

Siehe auch Abschnitt 7.9.1 Rules of Automatic Semicolon Insertion der ECMAScript-Spezifikation. Abgesehen von return gibt es vier weitere Situationen, in denen ein Semikolon aufgrund einer neuen Zeile eingefügt wird: break, continue, throw und ++ oder --.

Wenn ein continue, break, return oder throw Token und ein LineTerminator angetroffen wird wird, bevor das nächste Token gestoßen wird ein Semikolon automatisch nach dem continue, eingefügt break, return oder throw Token.

JavaScript Semicolon Insertion

Die "Gefahr" ist mit (aus dem obigen Link genommen, Hervorhebung hinzugefügt):

+0

Sie sagen also, dass ein Zeilenumbruch nach 'function()' oder 'object.method()' niemals einen Semikolon vor der nächsten fortlaufenden Zeile einfügen könnte? –

+0

Für 'function()' sollte JS kein Semikolon einfügen. Für 'object.method()' glaube ich nicht, dass es ein Semikolon einfügen wird, wenn es einen Zeilenumbruch vor weiteren verketteten Methodenaufrufen (aus Tests und Erfahrungen) gibt, aber ich bin nicht 100% auf was die Spezifikation ist Diese Situation (weil 'object.method()' eine gültige Syntax ist). –

+0

Danke. In der Praxis hatte ich noch nie ein Problem mit solchen Zeilenumbrüchen, aber ich bin immer paranoid, dass es da draußen einen Browser gibt, der meinen Code nicht richtig interpretiert, oder dass es einen Eckfall gibt, den ich ausführen werde in ... –

0

Es ist sicher.

Ich habe mir die Semikolon-Einfügungsregeln in der Spezifikation (3. Ausgabe) kurz angesehen, und für Funktionsdeklarationen ist es in Ordnung.

+0

Schauen Sie sich Abschnitt 7.9.1 an. Es gibt fünf Situationen, in denen das Einfügen einer neuen Zeile dazu führt, dass ein Semikolon eingefügt wird, wo es nicht erwünscht ist. –

+0

Ich bezog mich auf Funktionsdeklarationen. Funktion x() LINE_BREAK {ist OK. Dies gilt auch für Funktionsausdrücke. –

3

Ein Semikolon wird nur eingefügt, wenn die folgende Zeile keine gültige Fortsetzung der vorherigen Zeile ist (siehe Ausnahmen unten). So ist function() { mit { in der nächsten Zeile immer sicher.

Von der ECMAScript-Spezifikation:

Wenn, wie das Programm von links nach rechts analysiert wird, wird ein Token (die säumigen Token genannt) angetroffen wird, dass nicht von einer Produktion der Grammatik erlaubt, dann einem Semikolon wird automatisch vor dem fehlerhaften Token eingefügt, wenn eine oder mehrere der folgenden Bedingungen erfüllt sind:

• Das beanstandete Token wird durch mindestens einen LineTerminator vom vorherigen Token getrennt.

• Das problematische Token ist}.

Ausnahmen von dieser Regel sind die Inkrement/Dekrement-Operatoren, continue, break, return und throw, Argumente dessen muss immer auf der gleichen Linie sein:

Wenn ein ++ oder - Token Wenn der Parser es als Postfix-Operator behandelt und mindestens ein LineTerminator zwischen dem vorhergehenden Token und dem ++ oder - Token aufgetreten ist, wird automatisch ein Semikolon vor dem ++ oder - Token eingefügt.

Wenn ein Token zum Fortfahren, Brechen, Zurückgeben oder Werfen gefunden wird und ein LineTerminator vor dem nächsten Token gefunden wird, wird nach dem Token zum Fortfahren, Brechen, Zurückgeben oder Werfen automatisch ein Semikolon eingefügt.

Verwandte Themen