Als ich heute zufällig das O'Reilly-Buch mit JavaScript-Mustern las, fand ich eine interessante Sache (Seite 27 als Referenz).
In Javascript gibt es in einigen Fällen einen Unterschied, wenn die Startposition der Klammer unterschiedlich ist.
function test_function1() {
return
{
name: 'rajat'
};
}
var obj = test_function1();
alert(obj); //Shows "undefined"
Während
function test_function2() {
return {
name: 'rajat'
};
}
var obj = test_function2();
alert(obj); //Shows object
Hat irgendeine andere Sprache da draußen ein solches Verhalten? Wenn ja, dann müsste ich sicher meine Gewohnheit ändern .. :)
Ich mache mir hauptsächlich Sorgen um PHP, C, C ++, Java und Ruby.
javascript
language-agnostic
programming-languages
language-design
Rajat Singhal
quelle
quelle
Antworten:
Jede Sprache, die sich nicht auf Semikolons (sondern auf Zeilenumbrüche) stützt, um Anweisungen abzugrenzen, ermöglicht dies möglicherweise. Betrachten Sie Python :
Möglicherweise können Sie einen ähnlichen Fall in Visual Basic erstellen, aber auf den ersten Blick kann ich nicht herausfinden, wie, da VB bei der Platzierung von Werten ziemlich restriktiv ist. Folgendes sollte jedoch funktionieren, es sei denn, der statische Analysator beschwert sich über nicht erreichbaren Code:
Von den Sprachen, die Sie erwähnt haben, hat Ruby dieselbe Eigenschaft. PHP, C, C ++ und Java verwerfen Newline nicht einfach als Leerzeichen und benötigen Semikolons, um Anweisungen abzugrenzen.
Hier ist der entsprechende Code aus dem Python-Beispiel in Ruby:
quelle
Throw
undex.GetBaseException()
sind separate logische Linien. Da Basic in der Vergangenheit Zeilen verwendet, um seine Anweisungen abzugrenzen, ist ein "Gotcha" eher eine Situation, in der ein Programmierer glaubt, eine neue Anweisung in einer neuen logischen Zeile erstellt zu haben, dies jedoch nicht getan hat.Der JavaScript-Interpreter fügt
;
am Ende jeder Zeile automatisch ein hinzu , wenn er keines findet (mit einigen Ausnahmen wird hier nicht darauf eingegangen :).Im Grunde geht es also nicht um die Position der geschweiften Klammern (die hier ein Objektliteral darstellen, nicht wie in den meisten Sprachen um einen Codeblock), sondern um diese kleine "Funktion", die Ihr erstes Beispiel zu
return ;
=> zwingtundefined
. Sie können das Verhaltenreturn
in der ES5-Spezifikation überprüfen .Weitere Sprachen mit ähnlichem Verhalten finden Sie in Konrads Antwort .
quelle
undefined
die Rückgabe erzwingt . Ich habe das Stück über die anderen Sprachen geschrieben, denen afaik vorangestellt ist , also nimm es mit einem Körnchen Salz :).Höchstwahrscheinlich. Die Programmiersprache go von Google zeigt ein sehr ähnliches Verhalten (wenn auch mit unterschiedlichen Effekten). Wie dort erklärt:
Insgeheim denke ich, dass Rob Pike nur eine Ausrede wollte, um den One True Brace Style zu fordern.
quelle
Die Antwort auf diese Frage ist ziemlich einfach. Jede Sprache mit "automatischer Semikoloneinfügung" kann in dieser Zeile in Schwierigkeiten geraten. Das Problem damit
..ist, dass die js-Engine nach der
return;
Anweisung ein Semikolon einfügt (und daher zurückgibtundefined
). Dieses Beispiel ist ein guter Grund, geschweifte Klammern immer auf der rechten Seite und niemals auch auf der linken Seite zu öffnen . Da Sie bereits richtig bemerkt haben, wird der Interpreter dies bemerken und kann kein Semikolon einfügen, wenn sich in derselben Zeile eine geschweifte Klammer befindet.quelle
FWIW, JSLint meldet mehrere Warnungen mit dieser Syntax:
quelle
Die erste Sprache, in der ich darauf gestoßen bin, war awk (die auch einen Teil der Syntax "Kuriositäten" aufweist; optionale Semikolons, String-Verkettung nur mit Leerzeichen usw.). Ich denke, die DTrace-Designer, die die D-Syntax lose basierten Ich hatte genug Sinn, diese Funktionen NICHT zu kopieren, aber ich kann mich nicht mehr an meinen Kopf erinnern. Ein einfaches Beispiel (Zählen der Anzahl der ENTITY-Tags in einer DTD von meinem Mac aus):
Wenn dieses kleine Skript stattdessen mit der Klammer in einer eigenen Zeile geschrieben würde, würde Folgendes passieren:
quelle