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.