Czy każda funkcja JavaScript musi zwracać wartość?

99

Używam Netbeans do dodawania profesjonalnych komentarzy do każdej funkcji, piszę. Więc zaczynam każdy z nich, /**a następnie naciskam, Enteraby Netbeans wypełnił domyślny schemat komentarzy dla następującej funkcji.

Do tej pory używałem tego tylko dla języka PHP iw tym przypadku Netbeans zawsze dodawał @returns {type}część tylko w schemacie komentarzy, jeśli śledzenie funkcji PHP rzeczywiście zawierało returninstrukcję. W tzw. „Procedurach” (funkcjach, które nie zwracają żadnej wartości) brakowało tej części.

Dzisiaj wypróbowałem to samo dla funkcji Javascript i Netbeans dodał @returns {undefined}część do schematu komentarzy, mimo że następująca funkcja nic nie zwraca.

To mnie zdezorientowało. Czy Netbeans sugeruje w ten sposób, że każda funkcja Javascript musi coś zwracać? Co powinienem zrobić? Zignorować (lub usunąć) tę część schematu komentarzy lub postępować zgodnie z sugestią (jeśli to w ogóle jest sugestia) i dodać return false;na końcu taką funkcję, chociaż jest dla mnie bezużyteczna?

trejder
źródło
6
Jeśli nie określono wartości zwracanej, JavaScript zwróci undefined. W wielu językach zwracany jest wynik ostatniej instrukcji (bardziej przydatne, IMO). Nazywa się to niejawnymi zwrotami .
Zaz
Czy to odpowiada na twoje pytanie? Czy muszę coś zwracać w funkcji javascript?
cOborski

Odpowiedzi:

189

Krótka odpowiedź brzmi: nie.

rzeczywistym odpowiedź brzmi tak: silnik JS musi zostać poinformowany, że niektóre funkcje zakończył swoją działalność, która jest wykonywana przez funkcję powracającego coś. Dlatego też zamiast „zakończona” mówi się, że funkcja „zwróciła” .
Funkcja, której brakuje wyraźnej instrukcji return undefined, zwróci , tak jak funkcja C (++), która nie ma wartości zwracanej, mówi się (i jej podpis odzwierciedla to), aby zwrócić 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
}

Ponadto, w JS, jak w większości innych języków, możesz po prostu zignorować wartość zwracaną przez funkcję, co robi bardzo dużo:

(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

Na bardzo niskim poziomie zwrot przekłada się na pewien rodzaj skoku. Gdyby funkcja naprawdę nic nie zwracała, nie byłoby sposobu, aby wiedzieć, co i kiedy wywołać następną funkcję lub wywołać procedury obsługi zdarzeń i tym podobne.

Podsumowując: nie, funkcja JS nie musi niczego zwracać, jeśli idzie o twój kod. Ale jeśli chodzi o silniki JS: funkcja zawsze zwraca coś, czy to jawnie poprzez plikreturn instrukcji, czy niejawnie. Jeśli funkcja zwraca niejawnie, jej wartość zwracana zawsze będzie niezdefiniowana.

Elias Van Ootegem
źródło
5
Nie wierzę, że C ++ (lub C) „zwraca pustkę”. Tag „void” wskazuje, że nic nie zwraca. Jest to jednak drobna kwestia i nie ma nic wspólnego z zadanym pytaniem.
Jay
2
To nie faktycznie wrócić void, zwraca nic, ale jego podpis odzwierciedla to przez voidtyp zwracany.
Elias Van Ootegem
czy są jakieś korzyści z wydajności dla jawnego zwrotu w porównaniu z niejawnym?
4m1r
@ 4m1r: nie wiem, to chyba zależy od silnika. Jeśli występuje różnica w wydajności, najprawdopodobniej będzie nieistotna. niejawny zwrot vs return;jest prawdopodobnie przydatny tylko wtedy, gdy musisz wrócić wcześniej. pisanie return undefined;może dawać różne wyniki, jeśli będzie undefinedmiało inną wartość. Większość (jeśli nie wszystkie) przeglądarek wyświetli błąd przy próbie ponownego przypisania undefined, ale teoretycznie jest to możliwe na przykładzie z node.js
Elias Van Ootegem
1
@SebastianLasse: odnosiłem się do voidinnych języków (takich jak C), w których możesz mieć takie funkcje, jak void do_someting(int *arg), ale nie możesz mieć zmiennej z typem void. W C voidnie jest to typ, więc te funkcje nic nie zwracają , po prostu skaczą
Elias Van Ootegem
26

Nie, zwrot nie jest konieczny.

Ale żaden powrót nie zwraca plikuundefined

rapsodyn
źródło
6

Czy każda funkcja JavaScript musi zwracać wartość?

Nie, nie robią. To prawda, że ​​w szczegółach specyfikacji wszystkie są nieco inne:

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

... ale wynik nazywając każdy z nich jest taka sama: undefined. A więc w kategoriach pragmatycznych:

  1. Nie musisz pisać a return, możesz po prostu pozwolić, aby wykonanie kodu „wypadło z końca” funkcji
  2. Jeśli wracasz undefined, po prostu piszeszreturn;
  3. Podczas wywoływania funkcji nie można powiedzieć (w kodzie), czy wykonanie zakończyło się, zakończyło się return;, czy zakończyło się return undefined;; wszystkie wyglądają dokładnie tak samo jak Twój kod wywoławczy

Do specyfikacji: W szczególności, gdy wykonanie funkcji kończy się, w specyfikacji jest to „normalne” zakończenie; ale return;i return value;oba są uzupełnieniami „zwracanymi” ze skojarzoną wartością ( undefined), która jest (bardzo nieznacznie) inna. Ale różnica jest eliminowana przez semantykę wywoływania funkcji , która mówi:

...

  1. Jeśli result . [[Type]] to return, zwraca NormalCompletion ( result . [[Value]]).
  2. ReturnIfAbrupt ( wynik ).
  3. Zwróć NormalCompletion ( nieokreślone ).

Więc nie ma różnicy, którą można zaobserwować w kodzie.

TJ Crowder
źródło
2

Nie, nie musisz zwracać czegoś dla każdej funkcji. Jest to opcjonalne i zależne od tego, jak piszesz logikę kodu.

Mohkhan
źródło