Warum die Ergebnisse variieren, basierend auf geschweiften Klammer die Platzierung?
Warum der code-Schnipsel unten, entnommen aus dieser Artikel, zu unterschiedlichen Ergebnissen führen, durch nur eine einzige änderung in der Platzierung von geschweiften Klammern?
Wenn der öffnenden geschweiften Klammer {
ist auf einer neuen Zeile test()
zurück undefined
, und "Nein - es brach: "undefined" angezeigt wird, in der alert.
JS:
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 die Klammer auf der gleichen Linie wie return
, test()
gibt ein Objekt zurück, und "fantastisch" ist alarmiert.
JS:
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-insertion-Semantik nach
return
sind etwas anders als in anderen Orten, und ein line-break "heißt mehr" in diesem Punkt, als wäre es "midstream".
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das ist eine der Tücken von JavaScript: automatic semicolon insertion. Zeilen, die nicht mit einem Semikolon enden, aber könnte das Ende einer Anweisung automatisch beendet, also dein erstes Beispiel sieht effektiv wie diese:
Siehe auch Douglas Crockford ' s JS style-guide, die erwähnt Semikolon einfügen.
In Ihrem zweiten Beispiel, das Sie gibt ein Objekt zurück (gebaut von den geschweiften Klammern {}) mit der Eigenschaft
javascript
und seinen Wert von"fantastic"
effektiv die gleiche wie diese:javascript automatic semicolon insertion
return /*
und dann*/{
würde effektiv kommentieren Sie die versteckten semi-colon in älteren Versionen von chrome. Nicht sicher, ob das immer noch giltBB.promisifyAll(myFs); // name the anon function (async myReadFileAsync => { const contents = await myFs.readFileAsync('filename.txt') console.log('promisifyAll: ', contents) })()
Ohne die;
wird, versuchen Sie es zum ausführen der Rückkehr ausBB.promisifyAll(myFs)
das ist nicht das, was ich beabsichtigte.Javascript erfordert keine Semikolons am Ende der Anweisungen, aber der Nachteil ist, dass es zu erraten, wo die Semikolons sind. Die meisten der Zeit ist dies kein problem, aber manchmal erfindet Sie ein Semikolon, wo Sie nicht beabsichtigen, eine.
Einem Beispiel aus meinem blog-Beitrag über das (Javascript – fast nicht zeilenbasiert):
Wenn Sie formatieren Sie den code wie folgt:
Dann ist es interpretiert so:
Die return-Anweisung braucht, es ist parameterlosen form, und das argument wird eine Aussage von selbst.
Das gleiche passiert mit deinem code. Die Funktion ist wie folgt interpretiert:
Es ist, weil javascript meistens puts ";" am Ende jeder Zeile, also im Grunde, wenn Sie wieder { in einer Zeile javascript-engine zu sehen, dass es etwas mehr sein, und wenn es in neue Zeile er glaubt, Sie habe vergessen,";", und setzt es für Sie.
Den geschweiften Klammern geben hier den Bau eines neuen Objekts. Also dein code ist äquivalent zu:
welche Werke in der Erwägung, dass, wenn Sie schreiben:
nicht mehr funktioniert.
Ich persönlich bevorzuge die Allman-Stil für eine bessere Lesbarkeit (vs K&R-Stil).
Statt...
Mag ich...
Aber das ist ein work-around. Kann ich mit Leben, obwohl es.
Das problem ist in der Tat Semikolon-Injektion wie oben beschrieben. Gerade lese ich einen guten blog-posting zu diesem Thema. Es erklärt das Problem, und eine ganze Menge mehr über javascript. Es enthält auch einige gute Referenzen. Sie können Lesen hier