Apakah setiap fungsi Javascript harus mengembalikan nilai?

99

Saya menggunakan Netbeans untuk menambahkan komentar seperti profesional ke setiap fungsi, tulis saya. Jadi saya mulai dengan masing-masing /**dan kemudian saya tekan Enteruntuk membiarkan Netbeans memenuhi skema komentar default untuk fungsi berikut.

Sampai sekarang saya hanya menggunakan ini untuk bahasa PHP dan dalam hal ini Netbeans selalu menambahkan @returns {type}bagian dalam skema komentar saja, jika mengikuti fungsi PHP benar-benar menyertakan returnpernyataan. Pada apa yang disebut "prosedur" (fungsi yang tidak mengembalikan nilai apa pun) bagian ini hilang.

Hari ini saya mencoba hal yang sama untuk fungsi Javascript dan Netbeans menambahkan @returns {undefined}bagian ke skema komentar meskipun fungsi berikut tidak mengembalikan apa pun.

Ini membuatku bingung. Apakah Netbeans menyarankan seperti ini, bahwa setiap fungsi Javascript harus mengembalikan sesuatu? Apa yang harus saya lakukan? Abaikan (atau hapus) bagian skema komentar itu atau ikuti saran (jika ini adalah saran sama sekali) dan tambahkan return false;di akhir fungsi tersebut, meskipun itu tidak berguna bagi saya?

trejder
sumber
6
Jika tidak ada nilai kembali yang ditentukan, JavaScript akan kembali undefined. Dalam banyak bahasa, hasil dari pernyataan terakhir dikembalikan (lebih berguna, IMO). Ini disebut pengembalian implisit .
Zaz
Apakah ini menjawab pertanyaan Anda? Apakah saya harus mengembalikan sesuatu dalam fungsi javascript?
cOborski

Jawaban:

189

Jawaban singkatnya tidak.

The nyata Jawabannya adalah ya: mesin JS harus diberitahu bahwa beberapa fungsi selesai usahanya, yang dilakukan oleh fungsi mengembalikan sesuatu. Ini juga mengapa, alih-alih "selesai" , sebuah fungsi dikatakan "telah kembali" .
Sebuah fungsi yang tidak memiliki pernyataan pengembalian eksplisit akan kembali undefined, seperti fungsi C (++) yang tidak memiliki nilai pengembalian dikatakan (dan tanda tangannya mencerminkan ini) untuk mengembalikan 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
}

Selain itu, di JS, seperti di sebagian besar bahasa lainnya, Anda bebas mengabaikan nilai kembalian suatu fungsi, yang sering dilakukan:

(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

Pada tingkat yang sangat rendah, pengembalian diterjemahkan ke dalam semacam lompatan. Jika suatu fungsi benar-benar tidak menghasilkan apa pun , tidak akan ada cara untuk mengetahui apa dan kapan harus memanggil fungsi berikutnya, atau memanggil penangan kejadian dan sejenisnya.

Jadi untuk rekap: Tidak, fungsi JS tidak perlu mengembalikan apa pun sejauh kode Anda berjalan. Tapi sejauh menyangkut mesin JS: fungsi selalu mengembalikan sesuatu, baik itu secara eksplisit melalui returnpernyataan, atau secara implisit. Jika suatu fungsi kembali secara implisit, nilai kembaliannya akan selalu tidak ditentukan.

Elias Van Ootegem
sumber
5
Saya tidak percaya C ++ (atau C) "mengembalikan kekosongan". Tag "void" menunjukkan tidak mengembalikan apapun. Ini adalah poin kecil dan tidak ada hubungannya dengan pertanyaan yang diajukan.
Jay
2
Ia tidak benar - benar kembali void, ia tidak mengembalikan apa-apa, tetapi tanda tangannya mencerminkan ini melalui voidtipe pengembalian.
Elias Van Ootegem
apakah ada manfaat kinerja untuk pengembalian eksplisit vs. implisit?
4m1r
@ 4m1r: Saya tidak tahu, mungkin tergantung pada mesinnya. Jika ada perbedaan kinerja, kemungkinan besar dapat diabaikan. implicit return vs return;mungkin hanya berguna jika Anda perlu kembali lebih awal. tulisan return undefined;mungkin menghasilkan hasil yang berbeda jika undefinedditetapkan ke nilai yang berbeda. Sebagian besar (jika tidak semua) browser akan menampilkan kesalahan saat Anda mencoba menetapkan ulang tidak ditentukan, tetapi secara teori, ini mungkin adalah contoh menggunakan node.js
Elias Van Ootegem
1
@SebastianLasse: Saya mengacu voidpada bahasa lain (seperti C), di mana Anda dapat memiliki fungsi seperti void do_someting(int *arg), tetapi Anda tidak dapat memiliki variabel dengan tipe void. Di C, voidsebenarnya bukan tipe, jadi fungsi ini tidak mengembalikan apa pun, mereka hanya melompat
Elias Van Ootegem
26

Tidak, pengembalian tidak perlu.

Tapi sebenarnya tidak ada pengembalianundefined

rhapsodyn
sumber
6

Apakah setiap fungsi Javascript harus mengembalikan nilai?

Tidak, mereka tidak melakukannya. Memang benar bahwa jauh di dalam spesifikasinya, ini semua sedikit berbeda:

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

... tapi hasil memanggil masing-masing adalah sama: undefined. Jadi dalam istilah pragmatis:

  1. Anda tidak perlu menulis a return, Anda bisa membiarkan eksekusi kode "jatuh di akhir" fungsi
  2. Jika Anda kembali undefined, khususnya, Anda hanya menulisreturn;
  3. Saat memanggil suatu fungsi, Anda tidak dapat memberi tahu (dalam kode) apakah eksekusi gagal, diakhiri dengan return;, atau diakhiri dengan return undefined;; semuanya terlihat persis sama dengan kode panggilan Anda

Re the spec: Secara khusus, ketika eksekusi fungsi jatuh, dalam spesifikasi itu adalah penyelesaian "normal"; tetapi return;dan return value;keduanya merupakan penyelesaian "pengembalian" dengan nilai terkait ( undefined), yang (sangat sedikit) berbeda. Tetapi perbedaannya dihilangkan oleh semantik memanggil suatu fungsi , yang mengatakan:

...

  1. Jika hasilnya . [[Type]] adalah return, kembalikan NormalCompletion ( hasil . [[Value]]).
  2. ReturnIfAbrupt ( hasil ).
  3. Kembalikan NormalCompletion ( tidak ditentukan ).

Jadi tidak ada perbedaan yang bisa Anda amati dalam kode.

TJ Crowder
sumber
2

Tidak, Anda tidak perlu mengembalikan sesuatu untuk setiap fungsi. Ini opsional dan terserah bagaimana Anda menulis logika kode Anda.

mohkhan
sumber