Sind in einzeiligen Anweisungen in JavaScript geschweifte Klammern erforderlich?

161

Ich habe einmal gehört, dass das Belassen der geschweiften Klammern in einzeiligen Anweisungen in JavaScript schädlich sein kann. Ich erinnere mich nicht mehr an die Argumentation und eine Google-Suche hat nicht viel geholfen.

Gibt es etwas, das es zu einer guten Idee macht, alle Anweisungen in geschweiften Klammern in JavaScript zu umgeben?

Ich frage, weil jeder das zu tun scheint.

Turm
quelle
5
Hinweis: Nur die erste Anweisung übernimmt den Geltungsbereich, auch wenn Sie mehrere Anweisungen in einer Zeile haben. Es handelt sich also nicht um "einzeilige Anweisungen", sondern um eine einzelne Anweisung
Kris Ivanov,
1
Sie denken vielleicht an das in dieser Antwort
Blorgbeard ist am
@Blorgbeard: Nein, ich habe vor einiger Zeit tatsächlich auf diese Antwort geantwortet.
Turm
Hah, so verstehe ich.
Egal
Hier ist Ihre Antwort: medium.com/@jonathanabrams/…
Erwan Legrand

Antworten:

202

Nein

Aber sie werden empfohlen. Wenn Sie die Anweisung jemals erweitern, benötigen Sie sie.

Dies ist vollkommen gültig

if (cond) 
    alert("Condition met!")
else
    alert("Condition not met!")

Es wird jedoch dringend empfohlen, immer geschweifte Klammern zu verwenden, da dies erforderlich ist, wenn Sie (oder eine andere Person) die Anweisung jemals erweitern.

Dieselbe Vorgehensweise gilt für alle Sprachen im C-Syntaxstil mit geschweiften Klammern. C, C ++, Java und sogar PHP unterstützen eine einzeilige Anweisung ohne geschweifte Klammern. Sie müssen sich darüber im Klaren sein, dass Sie nur zwei Zeichen speichern und mit den Klammerstilen einiger Leute nicht einmal eine Zeile speichern. Ich bevorzuge einen vollständigen Zahnspangenstil (wie folgt), daher ist er tendenziell etwas länger. Der Kompromiss wird sehr gut mit der Tatsache erfüllt, dass Sie eine extrem klare Lesbarkeit des Codes haben.

if (cond) 
{
    alert("Condition met!")
}
else
{
    alert("Condition not met!")
}
Josh K.
quelle
28
+1, informative Antwort. Persönlich fand ich es jedoch nie nützlich, diese "empfohlene" Sache zu tun. Ich habe Python noch nie codiert, also füge ich nicht nur Dinge ein und erwarte, dass die Einrückung eine Rolle spielt. Wenn ich eine Anweisung hinzufüge, füge ich auch geschweifte Klammern hinzu. Immer. Ich kann mich nicht an ein einziges Mal erinnern, als es mich gebissen hat. Nicht in C, nicht in C #, nicht in JavaScript.
Jakob
16
@ Kirk: Douglas Crockford empfiehlt es. Ich stimme zu, dass es eine subjektive persönliche Entscheidung ist, aber wenn Sie in einer Gruppe arbeiten, ist es einfacher, die Klammern einfach einzugeben.
Josh K
10
@ Josh, oh, nun, Crockford hat es gesagt. Das muss das letzte Wort sein. ;) (nur ein Scherz) Das Problem ist, dass sich die Subjektivität dieses Punktes über alle C-ähnlichen Sprachen erstreckt und durchgehend starke Meinungen zu finden sind (für beide Positionen).
Kirk Woll
11
Meine persönliche Erfahrung zeigt, dass das Nicht-Platzieren von Armschienen bei der Arbeit in Teams zu großen Fehlern führen kann.
Sirs
4
Es wird empfohlen, immer die geschweiften Klammern {} zu verwenden. Wie @Arx sagte, gibt es viel mehr Raum für Fehler, wenn Sie sie weglassen. Apple hatte sogar einen Fehler in iOS SSL / TLS, weil sie keine geschweiften Klammern verwendeten
Keenan Lidral-Porter
94

Es gibt einen Lesbarkeitsaspekt: ​​Wenn Sie zusammengesetzte Anweisungen haben, kann dies sehr verwirrend sein. Das Einrücken hilft, bedeutet aber für den Compiler / Interpreter nichts.

var a;
var b;
var c;

//Indenting is clear
if (a===true)
  alert(a); //Only on IF
alert(b); //Always

//Indenting is bad
if (a===true)
  alert(a); //Only on IF
  alert(b); //Always but expected?

//Nested indenting is clear
if (a===true)
  if (b===true)
    alert(a); //Only on if-if
alert (b); //Always

//Nested indenting is misleading
if (a===true)
  if (b===true)
    alert(a); //Only on if-if
  alert (b); //Always but expected as part of first if?

//Compound line is misleading
//b will always alert, but suggests it's part of if
if (a===true) alert(a);alert(b); 
else alert(c); //Error, else isn't attached

Und dann gibt es noch einen Erweiterungsaspekt:

//Problematic
if (a===true)
  alert(a);
  alert(b); //We're assuming this will happen with the if but it'll happen always
else       //This else is not connected to an if anymore - error
  alert(c);

//Obvious
if (a===true) {
  alert(a); //on if
  alert(b); //on if
} else {
  alert(c); //on !if
} 

Wenn Sie immer die Klammern haben, müssen Sie andere Anweisungen in diesen Block einfügen.

Rudu
quelle
4
Deshalb sollten wir es immer als Einzeiler verwenden : if (a===true) alert(a);. Jetzt ist es klar!
João Pimentel Ferreira
1
Die Verwendung der geschweiften linken Klammer und der lockigen rechten Klammer macht die Bedingungen klar. Für die Träumer unter uns, auch als linker und rechter fliegender Vogel bezeichnet.
HalfMens
61

Die Frage fragt nach Aussagen in einer Zeile. Die vielen Beispiele zeigen jedoch Gründe, Klammern, die auf mehrzeiligen Anweisungen basieren, nicht wegzulassen. Es ist absolut sicher, keine Klammern in einer Zeile zu verwenden, wenn dies der von Ihnen bevorzugte Codierungsstil ist.

In der Frage wird beispielsweise gefragt, ob dies in Ordnung ist:

 if (condition) statement;

Es wird nicht gefragt, ob dies in Ordnung ist:

 if (condition)
   statement;

Ich denke, es ist vorzuziehen, Klammern wegzulassen, da dadurch der Code mit weniger überflüssiger Syntax besser lesbar wird.

Mein Codierungsstil besteht darin, niemals Klammern zu verwenden, es sei denn, der Code ist ein Block. Und niemals mehrere Anweisungen in einer einzigen Zeile zu verwenden (durch Semikolons getrennt). Ich finde das einfach zu lesen und zu klären und habe nie Probleme mit dem Umfang von If-Aussagen. Die Verwendung von Klammern für eine einzelne if-Bedingungsanweisung würde daher 3 Zeilen erfordern. So was:

 if (condition) {
   statement;
 }

Die Verwendung einer if-Anweisung mit einer Zeile ist vorzuziehen, da sie weniger vertikalen Raum benötigt und der Code kompakter ist.

Ich würde andere nicht zwingen, diese Methode zu verwenden, aber sie funktioniert für mich und ich könnte den Beispielen nicht widersprechen, wie das Weglassen von Klammern zu Codierungs- / Bereichsfehlern führt.

peawormsworth
quelle
1
Ich hatte immer das Gefühl, man sollte immer Zahnspangen einschließen ... aber ich überdenke es jetzt. Sie haben den Airbnb-Styleguide auf Ihrer Seite!
senderle
1
Sie vergessen jedoch, dass die meisten Code-Formatierer dies in ein zweizeiliges Format ändern, und Sie kehren zu problematischem Code zurück. Das vertikale Raumargument ist einfach albern. Die Lesbarkeit gewinnt immer und die heutigen Bildschirme sind riesig.
Kim
1
Die 2 Zeilen, die für jede Klammer hinzugefügt werden, um Ihre einzeiligen Anweisungen zu umgeben, sind keine großen Kosten im Vergleich zu einem potenziellen Schaden, der durch einen - selbst sehr sorgfältigen Entwickler - Verwalten Ihres Codes verursacht werden kann. Sie selbst können ein großartiger Entwickler mit mythischen Fähigkeiten sein, aber Sie können nicht davon ausgehen, dass es Ihre Kollegen sind. KÜSSEN, Dinge in einen Kontext einwickeln und es anderen so einfach wie möglich machen, sonst geraten Sie irgendwann in Schwierigkeiten.
Maciej Tokarz
@senderle Die Eslint-Regel, um dies zu kontrollieren, finden Sie hier: eslint.org/docs/rules/curly#multi /*eslint curly: ["error", "multi"]*/
Seidenfeuer
15

Technisch nein aber sonst absolut ja !!!

Vergessen Sie "Es ist Ihre persönliche Präferenz", "Der Code läuft einwandfrei", "Es hat bei mir gut funktioniert", "Es ist besser lesbar" yada yada BS. Dies kann leicht zu sehr ernsten Problemen führen, wenn Sie einen Fehler machen und glauben Sie mir, dass es sehr leicht ist, beim Codieren einen Fehler zu machen (Glauben Sie nicht? Schauen Sie sich den berühmten Apple Go to Fail-Fehler an ).

Argument: "Es ist persönliche Präferenz"

Nein ist es nicht. Es sei denn, Sie sind ein Ein-Mann-Team, das am Mars abreist, nein. Die meiste Zeit werden andere Leute Ihren Code lesen / ändern. In jedem seriösen Codierungsteam ist dies der empfohlene Weg, daher handelt es sich nicht um eine "persönliche Präferenz".

Argument: "Der Code läuft einwandfrei"

Der Spaghetti-Code auch! Bedeutet das, dass es in Ordnung ist, es zu erstellen?

Argument: "Es hat gut für mich funktioniert"

In meiner Karriere habe ich so viele Fehler gesehen, die aufgrund dieses Problems entstanden sind. Sie erinnern sich wahrscheinlich nicht daran, wie oft Sie das 'DoSomething()'Warum kommentiert und verblüfft haben 'SomethingElse()':

if (condition) 
    DoSomething();
SomethingElse();

Oder 'SomethingMore' hinzugefügt und nicht bemerkt, dass es nicht aufgerufen wird (obwohl der Einzug etwas anderes impliziert):

if (condition)
  DoSomething();
  SomethingMore();

Hier ist ein Beispiel aus dem wirklichen Leben, das ich hatte. Jemand wollte die gesamte Protokollierung deaktivieren, damit find & replace "console.log"=> ausgeführt wird //"console.log":

if (condition) 
   console.log("something");
SomethingElse();

Sehen Sie das Problem?

Selbst wenn Sie denken, "diese sind so trivial, würde ich das niemals tun"; Denken Sie daran, dass es immer ein Teammitglied mit schlechteren Programmierkenntnissen als Sie geben wird (hoffentlich sind Sie nicht der schlechteste im Team!)

Argument: "es ist besser lesbar"

Wenn ich etwas über Programmierung gelernt habe, werden die einfachen Dinge sehr schnell sehr komplex. Es ist sehr häufig, dass dies:

if (condition) 
    DoSomething();

wird nach dem Testen mit verschiedenen Browsern / Umgebungen / Anwendungsfällen oder dem Hinzufügen neuer Funktionen zu Folgendem:

if (a != null)
   if (condition) 
      DoSomething();
   else
      DoSomethingElse(); 
      DoSomethingMore();
else 
    if (b == null)
         alert("error b");
    else 
         alert("error a");

Und vergleiche es damit:

 if (a != null) {
    if (condition) { 
       DoSomething();
    }
    else {
       DoSomethingElse();
       DoSomethingMore();
    }
 } else if (b == null) {
    alert("error b");
 } else {
    alert("error a");
 }

PS: Bonuspunkte gehen an diejenigen, die den Fehler im obigen Beispiel bemerkt haben.

Caner
quelle
2
Nun, der offensichtliche Fehler ist DoSomethingMore (); Es gibt aber auch einen anderen Fehler. Wenn a null und b null ist, erhalten Sie nur "Fehler b", niemals "Fehler a".
Raketen sind schnell
Anhand Ihrer Beispiele weiß Ihr Entwicklungsteam überhaupt nicht, wie man codiert, Klammern helfen ihnen nicht ...
Carlos ABS vor
Einige Beispiele stammen vom Apple-Entwicklerteam
Caner vor
13

Es gibt kein Wartbarkeitsproblem!

Das Problem bei Ihnen allen ist, dass Sie überall Semikolons einfügen. Für mehrere Anweisungen benötigen Sie keine geschweiften Klammern. Wenn Sie eine Anweisung hinzufügen möchten, verwenden Sie einfach Kommas.

if (a > 1)
 alert("foo"),
 alert("bar"),
 alert("lorem"),
 alert("ipsum");
else
 alert("blah");

Dies ist ein gültiger Code, der wie erwartet ausgeführt wird!

William Malo
quelle
2
Sie nicht , dass Sie if, elseund alertnicht If, Elseund Alert?
Anish Gupta
Wow, das wusste ich nicht, danke, dass du mich informiert hast! Die meisten Leute scheinen dieses wichtige Detail wegzulassen.
Hendeca
13
Während dies in JavaScript funktioniert, ist es mir ein Rätsel, warum Sie das jemals tun möchten. Ich gehe davon aus, dass die Mehrheit der Entwickler sich dessen nicht bewusst ist (ich selbst vor dem Lesen eingeschlossen), was meiner Meinung nach dann schnell zu einem Wartbarkeitsproblem bei Entwicklern werden würde. Manchmal ist der klügste Weg nicht der beste.
Simon
14
Das ist schrecklich. Wenn jemand eine Anweisung hinzufügt und vergisst, das Semikolon in der vorletzten Anweisung im Block in ein Komma umzuwandeln, liegt ein Fehler vor, der sehr schwer zu erkennen ist, da das Komma und das Semikolon am Ende der Zeile ebenfalls gut aussehen ähnlich.
Ingo Bürk
1
Ich bevorzuge einen "Hemingwayian" -Ansatz : sehr sauber. Und ohne Leerzeichen zwischen ifund (wieif(true) doSomething();
victorf
8

Es gibt keinen Programmiergrund, die geschweiften Klammern in einzeiligen Anweisungen zu verwenden.

Dies hängt nur von den Vorlieben und der Lesbarkeit der Codierer ab.

Ihr Code wird dadurch nicht beschädigt.

Yahel
quelle
7

Zusätzlich zu dem von @Josh K genannten Grund (der auch für Java, C usw. gilt) ist ein spezielles Problem in JavaScript das automatische Einfügen von Semikolons . Aus dem Wikipedia-Beispiel:

return
a + b;

// Returns undefined. Treated as:
//   return;
//   a + b;

Dies kann also auch zu unerwarteten Ergebnissen führen, wenn es wie folgt verwendet wird:

if (x)
   return
   a + b;

Es ist nicht viel besser zu schreiben

if (x) {
   return
   a + b;
}

aber vielleicht ist der Fehler hier etwas leichter zu erkennen (?)

Chris Lercher
quelle
Alle diese Beispiele sehen für mich schrecklich aus, es sei denn, die Autoren sind vorübergehend und werden per Leitung bezahlt oder bis es funktioniert.
Cees Timmerman
4

Es gibt viele gute Antworten, daher werde ich nicht wiederholen, außer um meine „Regel“ zu sagen, wenn Klammern weggelassen werden können: unter Bedingungen, die als einzige Aussage „zurückkehren“ oder „werfen“ (z. B.) sind . In diesem Fall ist der Flusskontrolle bereits klar, dass sie beendet wird:

Sogar der „schlechte Fall“ kann aufgrund der abschließenden Flusskontrolle schnell identifiziert (und behoben) werden. Diese Konzept- / Strukturregel gilt auch für eine Reihe von Sprachen.

if (x)
    return y;
    always();

Dies ist natürlich auch der Grund, warum man einen Linter verwenden könnte.

user2864740
quelle
3

Hier ist, warum es empfohlen wird

Nehmen wir an, ich schreibe

if(someVal)
    alert("True");

Dann kommt der nächste Entwickler und sagt "Oh, ich muss noch etwas tun", also schreiben sie

if(someVal)
    alert("True");
    alert("AlsoTrue");

Wie Sie jetzt sehen können, ist "AlsoTrue" immer wahr, da der erste Entwickler keine geschweiften Klammern verwendet hat.

Amir Raminfar
quelle
Das ist nicht richtig, Sie vermissen das 'else': if (someVal) alert ("True"); sonst alert ("AlsoTrue"); wäre richtig. Ich würde es nicht verwenden, weil mir das {} gefällt, da es weitaus besser lesbar ist.
Gerrit B
1
Huh? Ich hatte keine andere Aussage. Ich sagte, dass es ohne geschweifte Klammern zu Fehlern führen kann, wenn jemand eine neue Zeile hinzufügt. Ich denke, Sie haben meinen Standpunkt nicht verstanden.
Amir Raminfar
Ich denke, was er sagt ist, dass die 2. Zeile ausgeführt wird, egal was passiert. Eine If-Anweisung ohne geschweifte Klammern kann nur 1 Zeile ausführen.
PostCodeism
3

Ich arbeite gerade an einem Minifier. Sogar jetzt überprüfe ich es auf zwei riesigen Skripten. Experimentell habe ich herausgefunden: Sie können die geschweiften Klammern hinter sich entfernen, wenn, sonst, während, Funktion *, wenn die geschweiften Klammern nicht ';', 'return', 'for', 'if', 'else', enthalten. 'while', 'do', 'function'. Unabhängig von Zeilenumbrüchen.

function a(b){if(c){d}else{e}} //ok  
function a(b){if(c)d;else e}   //ok

Natürlich müssen Sie die schließende Klammer durch ein Semikolon ersetzen, wenn sie nicht von einer anderen schließenden Klammer gefolgt wird.

Eine Funktion darf nicht mit einem Komma enden.

var a,b=function()c;  //ok *but not in Chrome
var b=function()c,a;  //error  

Getestet auf Chrome und FF.

BF
quelle
2

Hab das immer gefunden

if(valid) return;

ist leichter für mein Auge als

if(valid) {
  return;
}

auch bedingt wie

(valid) ? ifTrue() : ifFalse();

sind leichter zu lesen (meine persönliche Meinung) als

if(valid) {
  ifTrue();
} else {
  ifFalse();
}

aber ich denke, es kommt auf den Codierungsstil an

Yogi
quelle
2

Die Frage wird nicht direkt beantwortet, aber unten finden Sie eine kurze Syntax über die if-Bedingung in einer Zeile

Ex:

var i=true;
if(i){
  dosomething();
}

Kann so geschrieben werden:

var i=true;
i && dosomething();
Alee
quelle
1

Es gibt viele Probleme in Javascript. Schauen Sie sich den JavaScript-Architekten Douglas Crockford an, der darüber spricht. Die if- Anweisung scheint in Ordnung zu sein, aber die return- Anweisung kann ein Problem verursachen.

return
{
    ok:false;
}
//silent error (return undefined)

return{
    ok:true;
}
//works well in javascript
Kamayd
quelle
1

Ich fand diese Antwort auf der Suche nach einer ähnlichen Erfahrung und beschloss, sie mit meiner Erfahrung zu beantworten.

Bracketless-Anweisungen funktionieren in den meisten Browsern. Ich habe jedoch getestet, dass Bracketless-Methoden in einigen Browsern tatsächlich nicht funktionieren.

Ab dem 26. Februar 2018 funktioniert diese Anweisung in Pale Moon, nicht jedoch in Google Chrome.

function foo()
   return bar;
Gabriel I.
quelle
0

Die anfängliche Einrückungsstufe einer Anweisung sollte der Anzahl der offenen Klammern darüber entsprechen. (ausgenommen zitierte oder kommentierte Klammern oder solche in Präprozessor-Direktiven)

Andernfalls wäre K & R ein guter Einrückungsstil. Um ihren Stil zu korrigieren, empfehle ich, kurze einfache if-Anweisungen in eine Zeile zu setzen.

if (foo) bar();    // I like this. It's also consistent with Python FWIW

anstatt

if (foo)
   bar();   // not so good

Wenn ich einen Editor schreiben würde, würde die Schaltfläche für das automatische Formatieren die Leiste bis zur gleichen Zeile wie foo saugen und die Klammern um die Leiste einfügen, wenn Sie die Eingabetaste wie folgt drücken:

if (foo) {
  bar();    // better
}

Dann ist es einfach und konsistent, neue Anweisungen über oder unter der Leiste im Hauptteil der if-Anweisung hinzuzufügen

if (foo) {
  bar();    // consistent
  baz();    // easy to read and maintain
}
Toku
quelle
-1

Manchmal scheinen sie gebraucht zu werden! Ich konnte es selbst nicht glauben, aber gestern kam mir in einer Firebug-Sitzung (kürzlich Firefox 22.0) der Gedanke, dass

if (! my.condition.key)
    do something;

ausgeführt etwas trotz my.condition.key war wahr . Klammern hinzufügen:

if (! my.condition.var) {
    do something;
}

hat diese Angelegenheit behoben. Es gibt unzählige Beispiele, bei denen es anscheinend ohne Zahnspange funktioniert, aber in diesem Fall definitiv nicht.

Leute, die dazu neigen, mehr als eine Aussage in eine Zeile zu setzen, sollten auf jeden Fall immer geschweifte Klammern verwenden, weil Dinge wie

if (condition)
    do something; do something else;

sind schwer zu finden.

Tobias
quelle
Ich bin gespannt, in welchem ​​Szenario das Fehlen von Zahnspangen die if-Bedingung erfüllt hat. Können Sie sich daran erinnern oder ein echtes Beispiel dafür geben?
Gititgo
Der bedingte Ausdruck wird immer vor der Anweisung ausgewertet. Ich bin auch sehr neugierig, ein echtes Beispiel dafür zu sehen, da es einen Fehler im Interpreter darstellen würde.
Semikolon
-1

Ich möchte nur darauf hinweisen, dass Sie die geschweiften Klammern auch nur von den anderen weglassen können. Wie in diesem Artikel von John Resig zu sehen .

if(2 == 1){
    if(1 == 2){
        console.log("We will never get here")
    }
} else 
    console.log("We will get here")
Johnston
quelle
Der [Qt-Klammerstil] [1] erfordert Blöcke auf beiden Seiten einer elseKlammer, um der Verwendung der Klammer zu entsprechen. In diesem Beispiel wären die Klammern auf dem elseBlock erforderlich, um eine Codeüberprüfung zu bestehen. [1]: wiki.qt.io/Qt_Coding_Style#Braces
Pixelfett
Warum das Downvote? Die obige Aussage ist 100% korrekt.
Johnston
-1

Es gibt eine Möglichkeit, mehrzeilige, nicht geschweifte Klammern zu erreichen, wenn Anweisungen .. (Wow was Englisch ..), aber es ist ein bisschen langweilig:

if(true)
   funcName();
else
   return null;


function funcName(){
  //Do Stuff Here...
}
amanuel2
quelle
Sie müssen nicht so viele neue Linien haben, wenn Sie geschweifte Klammern weglassen. Das obige kann auch in zwei Zeilen geschrieben werden als: if (true) funcName()und else return null
Phobos