Muss jede Javascript-Funktion einen Wert zurückgeben?


99

Ich benutze Netbeans, um jeder Funktion, die ich schreibe, professionelle Kommentare hinzuzufügen. Also beginne ich jedes mit /**und drücke dann Enter, damit Netbeans das Standardkommentarschema für die folgende Funktion erfüllt.

Bis jetzt habe ich dies nur für die PHP-Sprache verwendet und in diesem Fall hat Netbeans immer nur einen @returns {type}Teil des Kommentarschemas hinzugefügt , wenn die folgende PHP-Funktion wirklich eine returnAnweisung enthielt . Bei sogenannten "Prozeduren" (Funktionen, die keinen Wert zurückgeben) fehlte dieser Teil.

Heute habe ich dasselbe für die Javascript-Funktion versucht und Netbeans hat einen @returns {undefined}Teil zum Kommentarschema hinzugefügt , obwohl die folgende Funktion nichts zurückgibt.

Das hat mich verwirrt. Schlägt Netbeans auf diese Weise vor, dass jede Javascript-Funktion etwas zurückgeben muss? Was soll ich machen? Ignorieren (oder löschen) Sie diesen Kommentarschema-Teil oder folgen Sie dem Vorschlag (wenn dies überhaupt ein Vorschlag ist) und fügen Sie ihn return false;am Ende einer solchen Funktion hinzu, obwohl er für mich nutzlos ist?


6
Wenn kein Rückgabewert angegeben wird, wird JavaScript zurückgegeben undefined. In vielen Sprachen wird das Ergebnis der letzten Anweisung zurückgegeben (nützlicher, IMO). Diese werden implizite Rückgaben genannt .
Zaz

Antworten:


189

Die kurze Antwort lautet nein.

Die eigentliche Antwort lautet Ja: Die JS-Engine muss benachrichtigt werden, dass eine Funktion ihr Geschäft beendet hat. Dies geschieht, indem die Funktion etwas zurückgibt. Dies ist auch der Grund, warum eine Funktion anstelle von "fertig" als "zurückgekehrt" bezeichnet wird .
Eine Funktion, der eine explizite return-Anweisung fehlt, wird zurückgegeben undefined, wie eine C (++) -Funktion, die keinen Rückgabewert hat (und deren Signatur dies widerspiegelt), um Folgendes zurückzugeben void:

void noReturn()//return type void
{
    printf("%d\n", 123);
    return;//return nothing, can be left out, too
}

//in JS:
function noReturn()
{
    console.log('123');//or evil document.write
    return undefined;//<-- write it or not, the result is the same
    return;//<-- same as return undefined
}

Wie in fast jeder Sprache können Sie auch in JS den Rückgabewert einer Funktion einfach ignorieren, was sehr viel getan wird:

(function()
{
    console.log('this function in an IIFE will return undefined, but we don\'t care');
}());
//this expression evaluates to:
(undefined);//but we don't care

Auf einem sehr niedrigen Niveau wird die Rückkehr in eine Art Sprung übersetzt. Wenn eine Funktion wirklich überhaupt nichts zurückgibt, gibt es keine Möglichkeit zu wissen, was und wann die nächste Funktion aufzurufen oder Ereignishandler und dergleichen aufzurufen.

Um es noch einmal zusammenzufassen: Nein, eine JS-Funktion muss in Bezug auf Ihren Code nichts zurückgeben. Aber was die JS-Engines betrifft: Eine Funktion gibt immer etwas zurück, sei es explizit über eine returnAnweisung oder implizit. Wenn eine Funktion implizit zurückgibt, ist ihr Rückgabewert immer undefiniert.


5
Ich glaube nicht, dass C ++ (oder C) "eine Leere zurückgibt". Das "void" -Tag zeigt an, dass nichts zurückgegeben wird. Es ist jedoch ein kleiner Punkt und hat nichts mit der gestellten Frage zu tun.
Jay

2
Es gibt nicht wirklich zurück void, es gibt nichts zurück, aber seine Signatur spiegelt dies durch den voidRückgabetyp wider .
Elias Van Ootegem

Gibt es Leistungsvorteile für eine explizite oder implizite Rendite?
4m1r

@ 4m1r: Ich weiß nicht, es hängt wahrscheinlich vom Motor ab. Wenn es einen Leistungsunterschied gibt, ist dieser höchstwahrscheinlich vernachlässigbar. implizite Rückgabe vs return;ist wahrscheinlich nur dann nützlich, wenn Sie frühzeitig zurückkehren müssen. Das Schreiben return undefined;kann zu unterschiedlichen Ergebnissen führen, wenn es undefinedin einen anderen Wert aufgelöst wird. Die meisten (wenn nicht alle) Browser geben einen Fehler aus, wenn Sie versuchen, undefiniert neu
zuzuweisen. Theoretisch ist

1
@SebastianLasse: Ich habe voidin anderen Sprachen (wie C) darauf verwiesen , wo Sie Funktionen wie haben können void do_someting(int *arg), aber Sie können keine Variable mit dem Typ haben void. In C voidist nicht wirklich eine Art, so dass diese Funktionen nicht zurückgeben nichts, sie springen nur
Elias Van Ootegem

25

Nein, eine Rücksendung ist nicht erforderlich.

Aber keine Rückkehr gibt tatsächlich die zurückundefined


6

Muss jede Javascript-Funktion einen Wert zurückgeben?

Nein, das tun sie nicht. Es ist wahr, dass tief in der Spezifikation diese alle leicht unterschiedlich sind:

function foo() {
}
function foo() {
    return;
}
function foo() {
    return undefined;
}

... aber das Ergebnis des Aufrufs jedes von ihnen ist das gleiche : undefined. Also pragmatisch ausgedrückt:

  1. Sie müssen keine schreiben return, Sie können einfach die Codeausführung "vom Ende fallen" lassen
  2. Wenn Sie zurückkehren undefined, schreiben Sie einfachreturn;
  3. Wenn Sie eine Funktion aufrufen, können Sie nicht (im Code) feststellen, ob die Ausführung vom Ende abgefallen ist, mit return;beendet oder mit beendet wurde return undefined;. Sie sehen für Ihren Anrufcode alle gleich aus

Zu der Spezifikation: Insbesondere wenn die Ausführung einer Funktion am Ende abfällt, ist dies in der Spezifikation eine "normale" Vervollständigung. aber return;und return value;sind beide "return" Vervollständigungen mit einem zugeordneten Wert ( undefined), der (ganz geringfügig) unterschiedlich ist. Der Unterschied wird jedoch durch die Semantik des Aufrufs einer Funktion beseitigt , die besagt:

...

  1. Wenn Ergebnis . [[Typ]] ist return, geben Sie NormalCompletion ( Ergebnis . [[Wert]]) zurück.
  2. ReturnIfAbrupt ( Ergebnis ).
  3. Rückgabe von NormalCompletion ( undefiniert ).

Es gibt also keinen Unterschied, den Sie im Code beobachten können.


2

Nein, Sie müssen nicht für jede Funktion etwas zurückgeben. Es ist optional und hängt davon ab, wie Sie Ihre Codelogik schreiben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.