it-swarm.com.de

Muss jede Javascript-Funktion einen Wert zurückgeben?

Ich benutze Netbeans, um zu 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.

Bisher habe ich dies nur für PHP language verwendet und in diesem Fall fügte Netbeans immer nur den Teil @returns {type} Im Kommentar-Schema hinzu, wenn PHP Funktion enthielt wirklich die Anweisung return 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 dem Kommentar-Schema einen @returns {undefined} - Teil hinzugefügt, obwohl die folgende Funktion nichts zurückgibt.

Das hat mich verwirrt. Schlägt Netbeans so vor, dass jede Javascript-Funktion irgendetwas zurückgeben muss? Was sollte ich tun? Ignoriere (oder lösche) diesen Teil des Kommentarschemas oder folge dem Vorschlag (falls dies überhaupt ein Vorschlag ist) und füge return false; Am Ende einer solchen Funktion hinzu, obwohl es für mich nutzlos ist?

90
trejder

Die kurze Antwort lautet nein.

Die echte Antwort lautet Ja: Der JS-Engine muss mitgeteilt werden, dass eine Funktion ihren Betrieb beendet hat, was von der Funktion ausgeführt wird, die etwas zurückgibt. Dies ist auch der Grund, warum anstelle von "erledigt" eine Funktion als "zurückgegeben" bezeichnet wird.
Eine Funktion ohne explizite return-Anweisung gibt undefined zurück, wie eine C (++) - Funktion, die keinen Rückgabewert hat (und deren Signatur dies widerspiegelt), 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
}

Außerdem können Sie in JS, wie in fast jeder Sprache, den Rückgabewert einer Funktion einfach ignorieren, was sehr viel bewirkt:

(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

Bei einem sehr niedrigen Pegel wird die Rückgabe in eine Art Sprung umgewandelt. Wenn eine Funktion wirklich nichts zurückliefe, gäbe es keine Möglichkeit zu wissen, was und wann die nächste Funktion oder Event-Handler und dergleichen aufzurufen sind.

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 immer gibt etwas zurück, sei es explizit über eine return -Anweisung oder implizit. Wenn eine Funktion implizit zurückgibt, ist ihr Rückgabewert immer undefiniert.

173

Nein, return ist nicht erforderlich.

Aber nein return gibt tatsächlich das undefined zurück

23
rhapsodyn

Muss jede Javascript-Funktion einen Wert zurückgeben?

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

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

... aber das Ergebnis von calling ist dasselbe: undefined. Also in pragmatischen Worten:

  1. Sie müssen kein return schreiben, sondern können die Codeausführung einfach vom Ende der Funktion abfallen lassen
  2. Wenn Sie undefined zurückgeben, schreiben Sie einfach return;
  3. Wenn Sie eine Funktion aufrufen, können Sie (im Code) nicht feststellen, ob die Ausführung am Ende fehlgeschlagen ist, mit return; Oder mit return undefined; Geendet hat. Sie sehen alle genauso aus wie Ihre Vorwahl

Zu der Spezifikation: Insbesondere, wenn die Ausführung einer Funktion vom Ende abfällt, ist die Spezifikation eine "normale" Fertigstellung. aber return; und return value; sind beide "Rückgabe" -Vervollständigungen mit einem zugeordneten Wert (undefined), der (noch so geringfügig) unterschiedlich ist. Der Unterschied wird jedoch durch die Semantik von Aufrufen einer Funktion beseitigt, die besagt:

...

  1. Wenn Ergebnis. [[Typ]] return ist, wird NormalCompletion ( Ergebnis. [[Wert]]) zurückgegeben.
  2. ReturnIfAbrupt ( Ergebnis).
  3. Rückgabe NormalCompletion ( undefined ).

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

4
T.J. Crowder

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.

2
mohkhan