Was ist der Unterschied zwischen return und return ()?

97
function a() { return 1; }
function b() { return(1); }

Ich habe den obigen Code in der Chrome-Konsole getestet und beide sind zurückgekehrt 1.

function c() { return "1"; }
function d() { return("1"); }

Ich habe auch den obigen Code getestet und beide Funktionen zurückgegeben "1".

Was ist der Unterschied zwischen returnund return()?

chris97ong
quelle
21
Die Antworten hier gilt auch für void(x),typeof(x)
Paul S.
3
@ PaulS. - war immer verwirrt, void(0)da es eine Abkürzung für undefiniert sein soll . Wenn es sich also um eine Kurzform handelt, warum sollten Sie unnötige Zeichen einfügen? ;-)
RobG
1
@RobG Ich denke, es ist eine Übertragung von Python und kann tatsächlich für spezielle Fälle nützlich sein, in denen Sie Operatoren void i = 1; // ReferenceErrorvsvoid (i = 1); // undefined
Paul S.
1
Sie könnten von dieser Frage amüsiert sein, die Ihre Frage ist, die auf C # angewendet wird: stackoverflow.com/questions/2186595/…
Eric Lippert
3
Mögliches Duplikat von Warum Klammern verwenden, wenn Sie in Javascript zurückkehren
Qantas 94 Heavy

Antworten:

177

Das gleiche wie zwischen

var i = 1 + 1;

und

var i = (1 + 1);

Das ist nichts. Die Klammern sind zulässig, da sie in jedem Ausdruck die Bewertungsreihenfolge beeinflussen dürfen. In Ihren Beispielen sind sie jedoch nur überflüssig.

returnist keine Funktion, sondern eine Aussage . Es ähnelt syntaktisch anderen einfachen Kontrollflussanweisungen wie breakund verwendet continueauch keine Klammern.

RemcoGerlich
quelle
12
Auf eine return-Anweisung kann ein Ausdruck folgen. Eine Rückgabe muss in einer Funktion erfolgen, daher gibt die Funktion den Wert des Ausdrucks zurück, oder, falls es keinen gibt, undefiniert .
RobG
37
@ chris97ong: return ist keine Funktion.
RemcoGerlich
34
Wenn Sie returneine Funktion erstellen würden, wie würden Sie einen Wert daraus zurückgeben?
dan04
4
Dies ist eine großartige Antwort mit einem großartigen Beispiel, aber ich denke, es könnte sich lohnen, hinzuzufügen, dass 'return' keine Funktion in der Hauptantwort ist - wenn man bedenkt, dass es die Wurzel des Missverständnisses ist, das zu dieser Frage geführt hat.
BiscuitBaker
3
@BiscuitBaker: Ich habe ein bisschen hinzugefügt. Als ich diese kurze Antwort aufschrieb, hatte ich nicht erwartet, dass sie mehr als 50 positive
Stimmen
21

Es gibt keinen Unterschied.

returnist kein Funktionsaufruf, sondern eine Sprachanweisung. Alles, was Sie mit den Klammern tun, ist einfach Ihren Rückgabewert zu gruppieren, damit er ausgewertet werden kann. Zum Beispiel könnten Sie schreiben:

return (x == 0);

In diesem Fall geben Sie den Wert der Anweisung zurück x == 0, der einen Booleschen Wert zurückgibt trueoder falsevom Wert von abhängt x.

Alpartis
quelle
6
return ist ein Schlüsselwort, das den Beginn einer return-Anweisung angibt .
RobG
1
Die Auswertung der return-Anweisung bedarf keiner "Gruppierung". In jedem Fall wird es also eine boolesche Rückgabe geben.
Wolf
18

Eigentlich hier Vorrang von () höher, daher wird zuerst bewertet:

Hier wird zunächst ("1")folgendermaßen ausgewertet:

("1")                     ==> "1"
("1","2")                 ==> "2"
("1","2","3")             ==> "3"
("1"+"2","2"+"2","3"+"2") ==> "32"
(2+3+6)                   ==>  11

Die obige Aussage entspricht also:

return "1";

Siehe visuell:

viusal

Es gibt also im Grunde keinen Unterschied in der Funktionalität, aber der zweite kann etwas vernachlässigbar langsam sein, da er erstens die Klammern löst.

Zaheer Ahmed
quelle
2
Warum würden Sie eine völlig unbestätigte Behauptung aufstellen, dass "die zweite etwas vernachlässigbar langsamer sein könnte", wenn dies nicht der Fall ist?
9

Es gibt absolut keinen Unterschied. Wenn Sie sich die JS- Spezifikation (ECMAScript) der return- Anweisung ansehen . Unter anderem sagt es Ihnen:

return [hier kein LineTerminator] Ausdruck;

dass Sie Ausdruck geben können return. Die Expression wird hello, Math.abs(x), yourCustomFunc(7), oder in Ihrem zweiten Fall kann dies sein 1oder (1). Der Ausdruck 1nach der Bewertung ist der gleiche wie (1)und der gleiche wie (((((1))))))oder sogar wie etwas wirklich Seltsames (+(!(+(!1)))).

Salvador Dali
quelle
1
+1 als offizielle Referenz. Gibt es nicht eine seitenweise Referenz? - Der einseitige HTML-Code wird sehr lange geladen.
Wolf
@ Wolf habe ich so nicht gefunden. Hier ist eine andere, aber es ist auch eine Seite people.mozilla.org/~jorendorff/…
Salvador Dali
Ja, traurig. Ich hätte auch keinen Erfolg. Wie wäre es, wenn Sie Ihr Zitat auf die gesamte Syntax der return-Anweisung erweitern?
Wolf
9

Es gibt keinen Unterschied, die Klammern sind optional. Siehe MSDN :

return[(][expression][)];

Das optionale Ausdrucksargument ist der Wert, der von der Funktion zurückgegeben werden soll. Wenn nicht angegeben, gibt die Funktion keinen Wert zurück.

Mit der return-Anweisung stoppen Sie die Ausführung einer Funktion und geben den Wert des Ausdrucks zurück. Wenn der Ausdruck weggelassen wird oder keine return-Anweisung innerhalb der Funktion ausgeführt wird, wird dem Ausdruck, der die aktuelle Funktion aufgerufen hat, der Wert undefined zugewiesen.

Evan Knowles
quelle
8
Nur MS würde denken, die Gruppierung in einer return-Anweisung "optional" zu machen . Sie sind dort genauso "optional" wie in jedem Ausdruck oder in vielen anderen Teilen der Grammatik.
RobG
@RobG: Aber anscheinend werden sie in einer returnErklärung viel häufiger gefragt . : P MS hat es wahrscheinlich satt, die Frage von JS Noobs zu beantworten.
CHao
2
Die M $ -Erklärung ist falsch. Das ()ist nicht Teil der return-Anweisung.
Salman A
4
"Es gibt einen Unterschied für den Leser." Ja, die MSDN-Spezifikation impliziert dies fälschlicherweisereturn (expression und return expression)ist legal.
Jim Balter
2
@JimBalter Zusammen mit return (), return (und return ): P
Paul
9

returnist eine Anweisung, ein Schlüsselwort, das die return-Anweisung startet , keine Funktion.

Wie bereits erwähnt, wirken sich die zusätzlichen Klammern auf die Auswertungsreihenfolge aus, werden jedoch nicht zum "Ausführen" der genannten Funktion verwendet return. Deshalb funktionieren diese Zeilen problemlos:

return (1);
var a = (1);

Sie sind praktisch identisch mit diesen Zeilen:

return 1;
var a = 1;

Der Grund, warum return()ein Syntaxfehler ausgelöst wird, ist der genaue Grund, warum die folgende Zeile einen Fehler auslöst (Rückgabeanweisung zum Vergleich enthalten):

return();    // SyntaxError: syntax error
var a = ();  // SyntaxError: syntax error
IQAndreas
quelle
Und nur als Randnotiz: Wenn danach returnnichts mehr enthalten ist, wird davon ausgegangen, dass Sie zurückkehren möchten undefined.
IQAndreas
@ Wolf Die Ausdrücke sind optional, daher ist sie returnfür sich genommen eine return-Anweisung.
Paul
6

Es gibt einen großen Unterschied für den Menschen und keinen Unterschied für die Javascript-Engine.

return 1ist eine Aussage, die erklärt, dass wir die Funktion sofort verlassen müssen, was den Wert 1 ergibt.

return(1)ist dieselbe Aussage, die durch die idiotische Konvention als Funktionsaufruf getarnt ist, dass Sie nicht verpflichtet sind, Leerzeichen außerhalb von Klammern in Javascript einzufügen. Wenn Sie solchen Code im Produktionssystem verwenden würden, kommt jeder Betreuer mit Pfählen und Fackeln in Ihr Büro, nachdem er einige Zeit damit verbracht hat, zu entscheiden, ob Sie wirklich return()irgendwo in der Codebasis eine Funktion haben oder einfach nicht wissen, wasreturn Schlüsselwort bestimmt ist.

Wie viele andere Leute bereits richtig gesagt haben, tun Klammern nichts anderes als "Gruppe" mit höherer Priorität als das Literal für die Zahl 1.

Hijarian
quelle
3
"Es gibt große Unterschiede für den Menschen" - Nicht kompetente. "die gleiche Anweisung, die als Funktionsaufruf getarnt ist" - es gibt keine returnFunktion. "die idiotische Konvention, dass Sie nicht verpflichtet sind, Leerzeichen außerhalb von Klammern in Javascript einzufügen" - fast keine Sprache erfordert dies; Dieses Idiotikum zu nennen ist idiotisch. "Jeder Betreuer wird mit Pfahl und Fackeln in Ihr Büro kommen" - niemand würde dies tun. return(1)ist eine schlechte Praxis, aber Menschen, die sich über solche Dinge aufregen, verschwenden Ressourcen und schaffen eine schlechte Atmosphäre.
Jim Balter
@ JimBalter "Nicht kompetente" - ha! "Fast keine Sprache erfordert das" - deshalb habe ich "Konvention" gesagt. Wenn es idiotisch ist, heißt es "idiotisch". "Es gibt keine returnFunktion" - Die Tatsache, dass der Dolmetscher Ihnen verbietet, eine Funktion mit Namen zu registrieren, returnhilft dem Leser des Codes nicht, seine geistige Gesundheit nicht zuerst in Frage zu stellen. Daher ist dieser Code Verschwendung. return(1)ist nicht nur "schlechte Praxis", sondern ein gefährliches Zeichen dafür, dass jemand nicht weiß, was er tut!
Hijarian
2
Entweder wissen Sie nicht, was "verpflichtet" bedeutet, oder Sie ändern Ihren Anspruch ... so oder so werde ich meine Zeit nicht mehr mit Ihnen verschwenden.
Jim Balter
Ich bezweifle den Troth Ihres letzten Satzes; returnhat (in allen mir bekannten Sprachen, die dieses Schlüsselwort haben) die geringste Priorität. Wenn der optionale Ausdruck vorhanden ist, wird er immer zuerst ausgewertet.
Wolf
4

In der return-Anweisung sind die Klammern um den Ausdruck bereits integriert.

In JavaScript besteht die return-Anweisung wie in vielen anderen Sprachen (wie C, C ++, Java, Python) aus zwei Teilen: dem Schlüsselwort returnund einem (optionalen) Ausdruck. In jedem Fall wird alles, was auf das returnSchlüsselwort folgt, zuerst als Ausdruck ausgewertet. Danach wird die return-Anweisung "ausgeführt", indem das Steuerelement an den Aufrufer zurückgegeben wird.

Klammern zu verwenden oder nicht zu verwenden, ist eine Frage des Stils , während die meisten Stilrichtlinien sie für triviale Fälle wie den in Ihrer Frage angegebenen verbieten, da dadurch die Rückgabe fälschlicherweise wie eine Funktion aussieht.

Späterer Nachtrag

Wenn Sie mit oder ohne Klammern arbeiten, vergessen Sie niemals, den optionalen Ausdruck hinter dem return, dh in derselben Zeile, zu platzieren. Die eigentliche Gefahr bei returnJavaScript besteht darin, danach einen Zeilenumbruch hinzuzufügen:

function test() {
  return 
  1;
}

... weil die obige testFunktion zurückkehrt undefined.

Wolf
quelle
1

Durch Hinzufügen von Klammern haben wir sichergestellt, dass Javascript kein Semikolon vor mehreren Anweisungen einfügt, die nach der Rückgabe geschrieben wurden. Als Referenz: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar #Automatic_semicolon_insertion

Beispiel :

return a + b;

verwandelt sich in

return; a + b;

von ASI.

Die Konsole warnt "Nicht erreichbarer Code nach Rückgabeanweisung". Um dieses Problem zu vermeiden (um ASI zu verhindern), können Sie Klammern verwenden:

return ( a + b );
Code kopiert von: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/return

Rahul Singh Bhadhoriya
quelle
Dies ist absolut richtig und auf diese Weise für komplexe Ausdrücke sinnvoll. Sie sollten jedoch im ersten Satz dieselbe Zeile oder direkt hinter der Rückgabe hinzufügen , um dies noch deutlicher zu machen. Ich denke, dass die Abwertung von einer Fehlinterpretation stammt.
Wolf