Warum variieren die Ergebnisse je nach Platzierung der geschweiften Klammern?

Lesezeit: 4 Minuten

Warum variieren die Ergebnisse je nach Platzierung der geschweiften Klammern
Lerne einfach

Warum machen die Codeschnipsel unten, entnommen aus Dieser Beitragaufgrund nur einer einzigen Änderung in der Platzierung der geschweiften Klammern unterschiedliche Ergebnisse erzeugen?

Wenn die öffnende geschweifte Klammer { ist in einer neuen Zeile, test() kehrt zurück undefinedund “nein – es ist kaputt: undefiniert” wird in der Warnung angezeigt.

function test()
{
  return
  { /* <--- curly brace on new line */
    javascript: "fantastic"
  };
}

var r = test();
try {
  alert(r.javascript); // does this work...?
} catch (e) {
  alert('no - it broke: ' + typeof r);
}

Wenn sich die Klammer auf derselben Linie befindet wie return, test() gibt ein Objekt zurück und “fantastisch” wird gewarnt.

function test()
{
  return { /* <---- curly brace on same line */
    javascript: "fantastic"
  };
}

var r = test();
try {
  alert(r.javascript); // does this work...?
} catch (e) {
  alert('no - it broke: ' + typeof r);
}

  • die Semi-Einfügungs-Semantik nach return sind etwas anders als an anderen Stellen, und ein Zeilenumbruch an dieser Stelle “bedeutet mehr” als “in der Mitte”.

    – dandavis

    3. Juni 2015 um 21:43 Uhr

1645958107 975 Warum variieren die Ergebnisse je nach Platzierung der geschweiften Klammern
Residuum

Das ist eine der Fallstricke von JavaScript: das automatische Einfügen von Semikolons. Zeilen, die nicht mit einem Semikolon enden, aber das Ende einer Anweisung sein könnten, werden automatisch beendet, sodass Ihr erstes Beispiel effektiv so aussieht:

function test()
{
  return; // <- notice the inserted semicolon
  { 
    javascript: "fantastic"
  };
}

Siehe auch JS-Styleguide von Douglas Crockfordder das Einfügen von Semikolons erwähnt.

In Ihrem zweiten Beispiel geben Sie ein Objekt (durch die geschweiften Klammern aufgebaut) mit der Eigenschaft zurück javascript und sein Wert von "fantastic"effektiv dasselbe wie dieses:

function test() {
    var myObject = new Object();
    myObject.javascript = "fantastic";
    return myObject;
}

  • Fun Fact: Bei einigen Engines können Sie die automatisch eingefügten Semikolons auskommentieren

    – Christoph Tarquini

    6. September 2010 um 3:55 Uhr

  • @ChrisT: Was? Welche? Ist das irgendwo erforscht?

    – Sean McMillan

    6. Juni 2013 um 15:51 Uhr

  • @SeanMcMillan Ich habe definitiv Artikel darüber gelesen, aber ich kann bei einer schnellen Suche keinen davon finden. Ich erinnere mich an das Putten return /* und dann */{ würde das versteckte Semikolon in älteren Versionen von Chrome effektiv auskommentieren. Keine Ahnung, ob das noch gilt

    – Christoph Tarquini

    11. Juni 2013 um 0:07 Uhr


  • Wegen dieser Macken habe ich mir vor 10 Jahren ein Versprechen gegeben: Finger weg vom Web! Ich habe gebetet, dass die Interwebs verschwinden… Leider lief es nicht wie geplant, und jetzt habe ich auch mit diesen Problemen zu kämpfen. Karma ist ab*tch 🙂

    – Joven

    14. April 2014 um 11:19 Uhr

  • Ich habe Leute gesehen, die religiös gegen Semikolons in JavaScript sind. Ich habe mich immer gefragt, was sie mit der zusätzlichen Zeit anfangen, die sie sparen, wenn sie keine Semikolons setzen.

    – Iman Mohamadi

    13. Dezember 2018 um 14:50 Uhr

Warum variieren die Ergebnisse je nach Platzierung der geschweiften Klammern
Guffa

Javascript benötigt keine Semikolons am Ende von Anweisungen, aber der Nachteil ist, dass es erraten muss, wo die Semikolons sind. Meistens ist das kein Problem, aber manchmal erfindet es ein Semikolon, wo Sie es nicht beabsichtigt haben.

Wenn Sie den Code wie folgt formatieren:

function getAnswer() {
   var answer = 42;
   return
      answer;
}

Dann wird es so interpretiert:

function getAnswer() {
  var answer = 42;
  return;
  answer;
}

Die return-Anweisung nimmt ihre parameterlose Form an, und das Argument wird zu einer eigenen Anweisung.

Dasselbe passiert mit Ihrem Code. Die Funktion wird interpretiert als:

function test()
{
  return;
  {
    javascript : "fantastic"
  };
}

Ich persönlich bevorzuge den Allman-Stil für die Lesbarkeit (gegenüber dem K&R-Stil).

Anstatt…

function test() {
  return {
    javascript : "fantastic"
  };
}

Ich mag…

function test() 
{
  var obj =
  {
    javascript : "fantastic"
  };

  return obj;
}

Aber das ist ein Workaround. Damit kann ich aber leben.

  • Ich denke, wir sollten persönliche Vorlieben vermeiden, die vom Mainstream abweichen. Wir sollten den Entscheidungen der Mehrheit folgen, was die Konsistenz fördert und die Lesbarkeit erhöht

    – Joven

    14. April 2014 um 11:12 Uhr

  • Ich finde seinen Code lesbarer als den K&R. Ziemlich subjektiv, wenn Sie “lesbar” meinen

    – Kleie

    23. März 2016 um 5:15 Uhr

  • Ich bevorzuge auch den Allman … aber aufgrund von ASI, wenn ich ein Objekt zurückgeben muss, lasse ich das Semi auf derselben Linie wie die Rückgabe. Ich ziehe dies vor, als eine Zeile “var x=” hinzuzufügen …

    – Mich

    1. April 2019 um 15:35 Uhr

Das liegt daran, dass Javascript am häufigsten “;” Am Ende jeder Zeile, also im Grunde, wenn Sie return { in derselben Zeile haben, sieht die Javascript-Engine, dass es noch etwas mehr geben wird, und wenn es in einer neuen Zeile steht, denkt es, dass Sie vergessen haben, “;” zu setzen, und setzt es für Sie.

Die geschweiften Klammern zeigen hier die Konstruktion eines neuen Objekts an. Somit ist Ihr Code äquivalent zu:

function test() {
  var a = { javascript : "fantastic" };
  return a;
}

was funktioniert, während wenn Sie schreiben:

function test() {
  var a = { javascript : "fantastic" };
  return; // ; is automatically inserted 
      a;
}

es funktioniert nicht mehr.

Das Problem ist in der Tat die oben beschriebene Semikolon-Injektion. Ich habe gerade einen guten Blogbeitrag zu diesem Thema gelesen. Es erklärt dieses Problem und noch viel mehr über Javascript. Es enthält auch einige gute Referenzen. Du kannst es lesen Hier

874960cookie-checkWarum variieren die Ergebnisse je nach Platzierung der geschweiften Klammern?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy