2014-03-04 10 views
5

ich ein gutes Stück Zeit auf dieser Javascript Ausgabe ausgegeben (kann ich einen JS Noob bin sagen):Warum beeinflusst die {Position diesen Javascript-Code?

Nehmen Sie sich etwas gut geschrieben Javascript-Code like this example des Revealing Module Muster:

funktioniert es läuft gut. Bewegen Sie dann das "{" zur nächsten Zeile (als C# -Entwickler richte ich alle meine Umgebungen ein, um geschweifte Klammern in neue Zeilen zu setzen) und führe es erneut aus.

Es werden jetzt einige JS-Fehler um "13 Zeilenumbruchfehler 'return'." und "Uncaught SyntaxError: Unexpected token:" in Chrome-Debugger.

Meine Frage ist, wie kann etwas syntaktisch das Javascript so beeinflussen?

Ich habe set it up here in JSFiddle (um es die {nach „Rückkehr“ wieder auf die gleiche Linie zu arbeiten, bewegen)

Antwort

8

Eine der schlimmsten Funktionen von JavaScript ist die automatische Semikolon-Insertion.

return; // a semicolon is implicitly inserted here 

Und dieser Teil ist fast gültig JavaScript, aber nicht ganz, so dass Sie einen Syntaxfehler erhalten:

{ 
    someMethod : myMethod, 
    someOtherMethod : myOtherMethod 
}; 

Wenn Sie hatte versucht, dies zu tun:

return 
    [ 1, 2, 3, 
     4, 5, 6, 
     7, 8, 9 ]; 

wäre es sind gerade undefined die ganze Zeit zurückgekehrt, und das wäre schlecht gewesen. ASI saugt, aber wir sind jetzt dran, zumal semicolonless Code eine Modeerscheinung geworden ist.

Was macht das?

return a 
    + b 
    + c; 

Dies?

return e 
    /f /g; 

Okay, okay, vielleicht ist das ein wenig kompliziert, und vielleicht ist das nicht ganz aktuell. Aber ASI ist schlecht. Ich hoffe, dass das jeder bekommt.

+0

Danke, das ist eine unabhängige Erklärung – Rodney

0

Da Rückkehr einen Wert erwartet (oder Variable), wenn Sie setzen die geschweifte Klammer in der gleichen Zeile, die Sie sagen geben Sie einen Hash zurück, aber wenn Sie die geschweifte Klammer in die nächste Zeile verschieben, dann sagen Sie geben Sie nichts zurück, so dass die nächste Zeile nicht erwartet wird.

BEARBEITEN Die nächste Zeile wird im Zusammenhang mit der Rückgabe nicht erwartet.

+0

Alles korrekt, außer dies ist: „so die nächste Zeile wird nicht erwartet ". Nächste Zeile wird erwartet, aber die Anweisung '{foo: 'bar'};' ist syntaktisch falsch – zerkms

+0

Bearbeitet, um eine ausführlichere Antwort zu geben, damit "die nächste Zeile nicht erwartet wird" – Aguardientico

+0

Okay. "Da return einen Wert (oder eine Variable) erwartet" "erwartet" console.log() 'auch einen Ausdruck, aber Sie können ihn in mehrere Zeilen aufteilen. "Einen Wert zu erwarten" bedeutet nicht, dass es nicht in eine andere Zeile gesetzt werden kann. – zerkms

2

Javascript tut etwas namens Automatic semi-colon insertion was ich glaube, was Ihre Ergebnisse hier betrifft. Im Grunde sieht es die return Anweisung mit nichts nach auf der Linie, und denkt, dass das Ende der Zeile ist und zurückkehrt, die Funktion zu beenden.

9

Da ECMA standard section 12.9 besagt, dass Sie keine neue Zeile zwischen dem Schlüsselwort return und seinem Ausdruck haben können.

 
    ReturnStatement : 
     return ; 
     return [no LineTerminator here] Expression ; 
0

Javascript hat einige seltsame Bits, um es und ist, dass die Position der Klammern Angelegenheiten - eine die Öffnung halten auf der gleichen Linie wie der Code

http://encosia.com/in-javascript-curly-brace-placement-matters-an-example/

+3

"ist, dass die Position der Klammern zählt" --- es ist nicht. Eine Position des Ausdrucks ist wichtig, nicht speziell geschweifte Klammern. – zerkms

+0

Dass Blogposts es gut zusammenfasst, danke - ich muss vielleicht meine Formatierung überdenken – Rodney