Jaka jest różnica między return i return ()?


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

Przetestowałem powyższy kod w konsoli Chrome i oba wróciły 1.

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

Przetestowałem również powyższy kod i obie funkcje zwróciły "1".

Jaka jest różnica między używaniem returna return()?


21
Odpowiedzi tutaj odnoszą się również do void(x),typeof(x)
Paul S.,

3
@ PaulS. - zawsze był zaskoczony, void(0)ponieważ miał być skrótem do undefined . Więc jeśli jest to skrótowe, po co włączać niepotrzebne znaki? ;-)
RobG

1
@RobG myślę, że to przeniesienie z Python i może faktycznie być użyteczny dla szczególnych przypadków, w których mają zostać włączone do operatorów void i = 1; // ReferenceErrorvsvoid (i = 1); // undefined
Paul S.

1
Możesz być rozbawiony tym pytaniem, które odnosi się do C #: stackoverflow.com/questions/2186595/…
Eric Lippert

Odpowiedzi:


177

To samo co pomiędzy

var i = 1 + 1;

i

var i = (1 + 1);

To nic. Nawiasy są dozwolone, ponieważ w każdym wyrażeniu mogą wpływać na kolejność oceny, ale w twoich przykładach są po prostu zbędne.

returnnie jest funkcją, ale instrukcją . Jest składniowo podobny do innych prostych instrukcji przepływu sterowania, takich jak breaki continuektóre również nie używają nawiasów.


12
Po instrukcji return może następować wyrażenie. Zwrot musi znajdować się w funkcji, więc funkcja zwraca wartość wyrażenia, a jeśli takiego nie ma, jest niezdefiniowana .
RobG,

37
@ chris97ong: return nie jest funkcją.
RemcoGerlich

34
Gdybyś utworzył returnfunkcję, w jaki sposób zwróciłbyś z niej wartość?
dan04

4
To świetna odpowiedź ze świetnym przykładem, ale myślę, że warto dodać, że „powrót” nie jest funkcją w głównej odpowiedzi - biorąc pod uwagę, że jest to źródło nieporozumienia, które doprowadziło do tego pytania.
BiscuitBaker

3
@BiscuitBaker: Dodałem trochę. Kiedy zanotowałem tę krótką odpowiedź, nie spodziewałem się, że otrzymam ponad 50 głosów pozytywnych ...
RemcoGerlich

21

Nie ma różnicy.

returnnie jest wywołaniem funkcji, ale instrukcją języka. Wszystko, co robisz z nawiasami, to po prostu grupowanie zwracanej wartości, aby można ją było ocenić. Na przykład możesz napisać:

return (x == 0);

W takim przypadku zwracasz wartość instrukcji x == 0, która zwróci wartość logiczną truelub w falsezależności od wartości x.


6
return to słowo kluczowe, które oznacza początek instrukcji return .
RobG,

1
Ocena instrukcji zwrotu nie wymaga „grupowania”. Tak więc w każdym przypadku nastąpi zwrot logiczny.
Wolf

18

Właściwie tutaj pierwszeństwo ()jest większe, więc najpierw jest oceniane:

Tutaj po pierwsze ("1") się ocenie w następujący sposób:

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

więc powyższe stwierdzenie jest równoważne z:

return "1";

Zobacz wizualnie:

viusal

Zasadniczo nie ma różnicy w funkcjonalności, ale druga może być pomijalnie wolna, ponieważ najpierw rozwiązuje nawiasy.


2
Dlaczego miałbyś robić całkowicie niezweryfikowane stwierdzenie, że „drugie może być pomijalnie nieco wolniejsze”, skoro tak nie jest?

9

Nie ma absolutnie żadnej różnicy. Jeśli spojrzysz na specyfikację JS (ECMAScript) instrukcji powrotu . Mówi między innymi:

return [tu nie ma LineTerminator] Expression;

którym możesz wyrazić return. Wyrażenie jest hello, Math.abs(x), yourCustomFunc(7), lub w drugim przypadku może to być 1albo (1). Wyrażenie 1po ocenie jest takie samo (1)i takie samo, (((((1))))))jak coś naprawdę dziwacznego (+(!(+(!1)))).


1
+1 do oficjalnego odniesienia. Czy nie ma odniesienia strona po stronie? - Jednostronicowy kod HTML wczytuje się bardzo długo.
Wolf

@Wolf takich nie znalazłem. Oto kolejna, ale jest to również jedna strona people.mozilla.org/~jorendorff/…
Salvador Dali

Tak, smutno. Ja też nie odniesie sukcesu. A co z rozszerzeniem oferty na całą składnię instrukcji return?
Wolf

9

Nie ma różnicy, nawiasy są opcjonalne. Zobacz MSDN :

return[(][expression][)];

Opcjonalny argument wyrażenia to wartość, która ma zostać zwrócona z funkcji. Jeśli pominięty, funkcja nie zwraca wartości.

Instrukcja return służy do zatrzymywania wykonywania funkcji i zwracania wartości wyrażenia. Jeśli wyrażenie zostanie pominięte lub żadna instrukcja return nie zostanie wykonana z poziomu funkcji, wyrażeniu, które wywołało bieżącą funkcję, zostanie przypisana wartość undefined.


8
Tylko państwo członkowskie pomyślałoby, aby grupowanie było „opcjonalne” w instrukcji zwrotu . Są tam „opcjonalne”, jak w każdym wyrażeniu lub w wielu innych częściach gramatyki.
RobG,

@RobG: Ale najwyraźniej jest o wiele bardziej prawdopodobne, że zostaną zapytani o to w returnoświadczeniu. : P MS prawdopodobnie zmęczyło się odpowiadaniem na pytanie noobsa JS.
cHao,

2
Wyjaśnienie M $ jest nieprawidłowe. Nie ()jest częścią instrukcji return.
Salman A

4
„Dla czytelnika jest różnica”. Cóż, tak: specyfikacja MSDN błędnie to sugeruje return (expressioni return expression)jest legalna.
Jim Balter,

2
@JimBalter Wraz z return (), return (i return ): P
Paul

9

returnjest instrukcją słowem kluczowym rozpoczynającym instrukcję return , a nie funkcją.

Jak już wspomniano, dodatkowe nawiasy wpływają na kolejność oceny, ale nie są używane do „wykonywania” nazwanej funkcji return. Dlatego te linie działają bez żadnych problemów:

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

W efekcie są one identyczne z tymi wierszami:

return 1;
var a = 1;

Przyczyną return()zgłaszania błędu składniowego jest dokładny powód, dla którego następujący wiersz zgłasza błąd (instrukcja return dołączona do porównania):

return();    // SyntaxError: syntax error
var a = ();  // SyntaxError: syntax error

I tak na marginesie, jeśli returnnie ma nic po nim, zakłada się, że chciałeś wrócić undefined.
IQAndreas

@Wolf Wyrażenia są opcjonalne, więc returnsamo w sobie jest instrukcją powrotu.
Paul,

6

Jest ogromna różnica dla ludzi i zerowa dla silnika Javascript.

return 1jest instrukcją deklarującą, że musimy natychmiast wyjść z funkcji dającej wartość 1.

return(1)to ta sama instrukcja, która jest zamaskowana jako wywołanie funkcji przez idiotyczną konwencję, że nie musisz wstawiać spacji poza nawiasy w JavaScript. Jeśli użyjesz takiego kodu w systemie produkcyjnym, każdy opiekun przyjdzie do twojego biura z palikiem i pochodniami, po spędzeniu trochę czasu próbując zdecydować, czy naprawdę masz return()funkcję gdzieś w bazie kodu, czy po prostu nie wiesz, coreturn służy słowo kluczowe.

Jak już słusznie powiedziało wiele innych osób, nawiasy nie robią nic poza „grupowaniem” z wyższym priorytetem literału liczby 1.


3
„Dla ludzi jest ogromna różnica” - nie są kompetentni. „ta sama instrukcja w przebraniu wywołania funkcji” - nie ma returnfunkcji. „idiotyczna konwencja, że ​​nie jesteś zobowiązany do wstawiania spacji poza nawiasami w JavaScript” - prawie żaden język tego nie wymaga; nazwanie tego idiotą jest idiotyczne. „jakikolwiek opiekun przyjdzie do twojego biura z palikiem i pochodniami” - nikt kompetentny tego nie zrobi. return(1)to kiepska praktyka, ale ludzie, którzy denerwują się takimi rzeczami, marnują zasoby i tworzą złą atmosferę.
Jim Balter

@JimBalter "Niekompetentni" - ha! „Prawie żaden język tego nie wymaga” - dlatego powiedziałem „konwencja”. Jeśli jest idiotyczny, nazywa się go „idiotycznym”. „Nie ma returnfunkcji” - fakt, że interpreter zabroni rejestracji funkcji z nazwą return, nie pomoże czytelnikowi kodu nie kwestionować najpierw jego poczytalności, więc ten kod jest marnotrawstwem. return(1)to nie tylko „słaba praktyka”, to niebezpieczny znak, że ktoś nie wie, co robi!
hijarian

2
Więc albo nie wiesz, co oznacza „zobowiązanie”, albo zmieniasz swoje roszczenie… tak czy inaczej, nie będę marnować więcej czasu na ciebie.
Jim Balter

Wątpię w treść twojego ostatniego zdania; returnma (we wszystkich znanych mi językach, które mają to słowo kluczowe) najmniejszy priorytet. Tak więc, jeśli opcjonalne wyrażenie jest obecne, jest ono zawsze oceniane jako pierwsze.
Wilk

4

W instrukcji return nawiasy wokół wyrażenia są już wbudowane.

W JavaScript, podobnie jak w wielu innych językach (np. C, C ++, Java, Python) instrukcja return ma dwie części: słowo kluczowe returni (opcjonalne) wyrażenie. Zatem w każdym przypadku wszystko, co następuje po returnsłowie kluczowym, jest najpierw oceniane jako wyrażenie , a następnie instrukcja return jest „wykonywana” przez przekazanie kontroli z powrotem do obiektu wywołującego.

Używanie lub nie używanie nawiasów to kwestia stylu , podczas gdy większość przewodników po stylach zabrania ich w trywialnych przypadkach, takich jak ten cytowany w twoim pytaniu, ponieważ powoduje to, że powrót fałszywie wygląda jak funkcja.

Późniejszy dodatek

Jeśli z nawiasami lub bez, nigdy nie zapomnij umieścić opcjonalnego wyrażenia za return, to znaczy w tym samym wierszu. Prawdziwa pułapka ze returnw kłamstwach javascript w dodawaniu przerwę po niej:

function test() {
  return 
  1;
}

... ponieważ powyższa testfunkcja zwróci undefined.


1

dodając nawiasy, upewniliśmy się, że javascript nie wstawia średnika przed wieloma instrukcjami napisanymi po powrocie, w celach informacyjnych: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar #Automatic_semicolon_insertion

przykład :

return a + b;

jest przekształcany do

return; a + b;

przez ASI.

Konsola ostrzeże „nieosiągalny kod po instrukcji return”. Aby uniknąć tego problemu (aby zapobiec ASI), możesz użyć nawiasów:

return ( a + b );
kod skopiowany z: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/return


Jest to całkowicie poprawne i dlatego ma sens w przypadku złożonych wyrażeń. Ale powinieneś dodać w tym samym wierszu lub bezpośrednio za powrotem w pierwszym zdaniu, aby było jeszcze bardziej zrozumiałe. Myślę, że negatywny głos wynika z błędnej interpretacji tego.
Wilk
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.