Apa perbedaan antara return dan return ()?

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

Saya menguji kode di atas di konsol Chrome, dan keduanya kembali 1 .

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

Saya juga menguji kode di atas, dan kedua fungsi dikembalikan "1" .

Jadi apa perbedaan antara menggunakan returndan return()?

chris97ong.dll
sumber
21
Jawabannya di sini juga berlaku untuk void(x),typeof(x)
Paul S.
3
@ PaulS. — selalu dibingungkan oleh void(0)karena itu seharusnya singkatan dari undefined . Jadi jika itu singkat, mengapa menyertakan karakter yang tidak perlu? ;-)
RobG
1
@RobG Saya pikir ini adalah bawaan dari Python dan mungkin benar-benar berguna untuk kasus-kasus khusus di mana Anda ingin memasukkan operator void i = 1; // ReferenceErrorvsvoid (i = 1); // undefined
Paul S.
1
Anda mungkin terhibur dengan pertanyaan ini, yang mana pertanyaan Anda diterapkan ke C #: stackoverflow.com/questions/2186595/…
Eric Lippert

Jawaban:

177

Sama seperti di antara

var i = 1 + 1;

dan

var i = (1 + 1);

Artinya, tidak ada. Tanda kurung diperbolehkan karena diperbolehkan dalam ekspresi apa pun untuk memengaruhi urutan evaluasi, tetapi dalam contoh Anda, tanda kurung itu berlebihan.

returnbukanlah sebuah fungsi, tapi sebuah pernyataan . Ini secara sintaksis mirip dengan pernyataan aliran kontrol sederhana lainnya seperti breakdan continueyang juga tidak menggunakan tanda kurung.

RemcoGerlich
sumber
12
Sebuah pernyataan kembali dapat diikuti oleh ekspresi. Pengembalian harus dalam sebuah fungsi, sehingga fungsi tersebut mengembalikan nilai ekspresi, atau jika tidak ada, tidak ditentukan .
RobG
37
@ chris97ong: return bukanlah sebuah fungsi.
RemcoGerlich
34
Jika Anda membuat returnsebuah fungsi, bagaimana Anda mengembalikan nilai darinya?
dan04
4
Ini adalah jawaban yang bagus dengan contoh yang bagus, tetapi saya pikir mungkin ada baiknya menambahkan bahwa 'return' bukanlah fungsi ke dalam jawaban utama - mengingat itu adalah akar dari kesalahpahaman yang menyebabkan pertanyaan ini.
BiscuitBaker
3
@BiscuitBaker: Saya menambahkan sedikit. Ketika saya menuliskan jawaban singkat ini, saya tidak menyangka akan mendapatkan 50+
suara positif
21

Tidak ada perbedaan.

returnbukanlah pemanggilan fungsi, tetapi merupakan pernyataan bahasa. Yang Anda lakukan dengan tanda kurung hanyalah mengelompokkan nilai kembalian Anda sehingga dapat dievaluasi. Misalnya, Anda bisa menulis:

return (x == 0);

Dalam kasus ini, Anda mengembalikan nilai pernyataan x == 0, yang akan mengembalikan boolean trueatau falsebergantung pada nilai x.

alpartis
sumber
6
return adalah kata kunci yang menandakan dimulainya pernyataan return .
RobG
1
Evaluasi pernyataan return tidak membutuhkan "pengelompokan". Jadi bagaimanapun juga akan ada pengembalian boolean.
Serigala
18

Sebenarnya di sini didahulukan () lebih tinggi jadi dievaluasi dulu:

Di sini terlebih dahulu ("1")dievaluasi, dengan cara berikut:

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

jadi pernyataan di atas sama dengan:

return "1";

Lihat secara visual:

viusal

Jadi pada dasarnya tidak ada perbedaan dalam fungsionalitas tetapi yang kedua mungkin agak lambat karena pertama-tama menyelesaikan tanda kurung.

Zaheer Ahmed
sumber
2
Mengapa Anda membuat pernyataan yang benar-benar tidak diverifikasi bahwa "yang kedua mungkin sedikit lebih lambat" padahal bukan itu masalahnya?
9

Sama sekali tidak ada perbedaan. Jika Anda akan melihat spesifikasi pernyataan pengembalian JS (ECMAScript) . Di antara banyak hal lainnya, ini memberi tahu Anda:

kembali [tidak ada LineTerminator di sini] Ekspresi;

yang dapat Anda berikan ekspresi return. Ekspresi hello, Math.abs(x), yourCustomFunc(7), atau dalam kasus kedua Anda ini bisa 1atau (1). Ekspresi 1setelah evaluasi adalah sama (1)dan sama (((((1))))))atau bahkan sebagai sesuatu yang sangat aneh (+(!(+(!1)))).

Salvador Dali
sumber
1
1 untuk referensi resmi. Apakah tidak ada referensi halaman demi halaman? - HTML satu halaman dimuat sangat lama.
Serigala
@ Serigala saya belum menemukan seperti itu. Ini satu lagi, tapi ini juga satu halaman people.mozilla.org/~jorendorff/…
Salvador Dali
Iya sedih. Saya juga tidak akan berhasil. Bagaimana dengan memperluas kutipan Anda ke seluruh sintaks dari pernyataan pengembalian?
Serigala
9

Tidak ada perbedaan, tanda kurung bersifat opsional. Lihat MSDN :

return[(][expression][)];

Argumen ekspresi opsional adalah nilai yang akan dikembalikan dari fungsi. Jika dihilangkan, fungsi tidak mengembalikan nilai.

Anda menggunakan pernyataan return untuk menghentikan eksekusi fungsi dan mengembalikan nilai ekspresi. Jika ekspresi dihilangkan, atau tidak ada pernyataan kembali yang dieksekusi dari dalam fungsi, ekspresi yang memanggil fungsi saat ini diberi nilai tidak terdefinisi.

Evan Knowles
sumber
8
Hanya MS akan berpikir untuk membuat pengelompokan "opsional" dalam pernyataan kembali . Mereka ada sebagai "opsional" di sana seperti dalam ekspresi apa pun, atau banyak bagian lain dari tata bahasa.
RobG
@RobG: Tapi tampaknya, mereka jauh lebih mungkin untuk ditanyai dalam sebuah returnpernyataan. : P MS mungkin bosan menjawab pertanyaan dari noobs JS.
cHao
2
Penjelasan M $ salah. Itu (), bukan bagian dari pernyataan return.
Salman A
4
"Ada perbedaan bagi pembaca." Ya: Spesifikasi MSDN secara keliru menyiratkan hal itu return (expressiondan return expression)legal.
Jim Balter
2
@JimBalter Seiring dengan return (), return (dan return ): P
Paul
9

returnadalah pernyataan kata kunci yang memulai pernyataan kembali , bukan fungsi.

Seperti yang telah disebutkan, tanda kurung tambahan memengaruhi urutan evaluasi, tetapi tidak digunakan untuk "menjalankan" fungsi yang dinamai return. Itulah mengapa garis-garis ini berfungsi tanpa masalah:

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

Sebenarnya, mereka identik dengan baris-baris berikut:

return 1;
var a = 1;

Alasan return()melontarkan kesalahan sintaks adalah untuk alasan yang tepat baris berikut menampilkan kesalahan (pernyataan pengembalian disertakan untuk perbandingan):

return();    // SyntaxError: syntax error
var a = ();  // SyntaxError: syntax error
IQAndreas
sumber
Dan hanya sebagai catatan tambahan, jika returntidak menyertakan apapun setelahnya, itu mengasumsikan Anda ingin kembali undefined.
IQAndreas
@Wolf Ekspresi adalah opsional, jadi returndengan sendirinya adalah pernyataan kembali.
Paul
6

Ada perbedaan besar bagi manusia, dan tidak ada perbedaan untuk mesin Javascript.

return 1adalah pernyataan yang menyatakan bahwa kita harus segera keluar dari fungsi yang menghasilkan nilai 1.

return(1)adalah pernyataan yang sama yang disamarkan sebagai pemanggilan fungsi oleh konvensi idiot bahwa Anda tidak diwajibkan untuk memasukkan spasi di luar tanda kurung dalam Javascript. Jika Anda akan menggunakan kode seperti ini dalam sistem produksi, pengelola mana pun akan datang ke kantor Anda dengan pancang dan obor, setelah menghabiskan beberapa waktu mencoba memutuskan apakah Anda benar-benar return()berfungsi di suatu tempat di basis kode atau hanya tidak tahu apareturn kata kunci itu.

Seperti yang telah dikatakan banyak orang dengan benar, tanda kurung tidak melakukan apa pun kecuali "kelompok" dengan memprioritaskan literal untuk nomor tersebut 1.

hijarian
sumber
3
"Ada perbedaan besar bagi manusia" - Bukan yang kompeten. "pernyataan yang sama disamarkan sebagai pemanggilan fungsi" - tidak ada returnfungsi. "konvensi bodoh bahwa Anda tidak diwajibkan untuk memasukkan spasi di luar tanda kurung di Javascript" - hampir tidak ada bahasa yang mengharuskan itu; menyebut ini idiot itu bodoh. "pengelola mana pun akan datang ke kantor Anda dengan membawa tiang dan obor" - tidak ada yang berkompeten. return(1)adalah praktik yang buruk tetapi orang-orang yang marah karena hal-hal seperti itu membuang-buang sumber daya dan menciptakan suasana yang buruk.
Jim Balter
@JimBalter "Bukan yang kompeten" - ha! "Hampir tidak ada bahasa yang mensyaratkan itu" - itulah mengapa saya mengatakan "konvensi". Jika itu bodoh, itu disebut "idiot". "Tidak ada returnfungsi" - fakta bahwa juru bahasa akan melarang Anda mendaftarkan fungsi dengan nama returntidak akan membantu pembaca kode untuk tidak mempertanyakan kewarasannya terlebih dahulu, jadi, kode ini sia-sia. return(1)bukan hanya "latihan yang buruk", itu adalah tanda berbahaya dari seseorang yang tidak tahu apa yang dia lakukan!
Pembajak
2
Jadi, Anda juga tidak tahu apa artinya "berkewajiban", atau Anda mengubah klaim Anda ... bagaimanapun juga, saya tidak akan menyia-nyiakan waktu saya lagi untuk Anda.
Jim Balter
Saya meragukan kebenaran kalimat terakhir Anda; returnmemiliki (dalam semua bahasa yang saya tahu yang memiliki kata kunci ini) memiliki prioritas paling rendah. Jadi, jika ekspresi opsional ada, itu selalu dievaluasi terlebih dahulu.
Wolf
4

Dalam pernyataan return, tanda kurung di sekitar ekspresi sudah ada di dalamnya.

Dalam JavaScript, seperti dalam banyak bahasa lain (seperti C, C ++, Java, Python), pernyataan return memiliki dua bagian: kata kunci returndan ekspresi (opsional). Jadi dalam kasus apa pun, semua yang mengikuti returnkata kunci dievaluasi pertama kali sebagai ekspresi , setelah itu, pernyataan return "dieksekusi" dengan meneruskan kontrol kembali ke pemanggil.

Menggunakan atau tidak menggunakan tanda kurung adalah masalah gaya , sedangkan kebanyakan panduan gaya melarangnya untuk kasus-kasus sepele seperti yang dikutip dalam pertanyaan Anda, karena itu membuat pengembalian terlihat salah seperti fungsi.

Adendum kemudian

Jika dengan tanda kurung atau tanpa, jangan pernah lupa untuk menempatkan ekspresi opsional di belakang return, yaitu di baris yang sama. Kesalahan sebenarnya dengan returnJavaScript terletak pada penambahan jeda baris setelahnya:

function test() {
  return 
  1;
}

... karena testfungsi di atas akan kembali undefined.

Serigala
sumber
1

dengan menambahkan tanda kurung, kami telah memastikan bahwa javascript tidak memasukkan titik koma sebelum beberapa pernyataan ditulis setelah dikembalikan, untuk referensi: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar #Automatic_semicolon_insertion

contoh :

return a + b;

diubah menjadi

return; a + b;

oleh ASI.

Konsol akan memperingatkan "kode tidak dapat dijangkau setelah pernyataan kembali". Untuk menghindari masalah ini (untuk mencegah ASI), Anda dapat menggunakan tanda kurung:

return ( a + b );
kode disalin dari: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/return

Rahul Singh Bhadhoriya
sumber
Ini benar sekali dan dengan cara itu masuk akal untuk ekspresi kompleks. Tetapi Anda harus menambahkan pada baris yang sama atau tepat di belakang kembali pada kalimat pertama untuk membuatnya lebih jelas. Menurut saya, suara negatif tersebut berasal dari salah tafsir atas hal ini.
Serigala