Kami menggunakan pernyataan kembali secara opsional dalam fungsi JavaScript. Itu kata kunci. Tapi apa tipe sebenarnya dari return
dirinya sendiri. Sebenarnya saya sempat bingung melihat contoh:
function add(a, b) {
return (
console.log(a + b),
console.log(arguments)
);
}
add(2, 2);
Keluaran:
4
[2, 2]
Jadi, kita bisa meneruskan ekspresi yang dipisahkan koma ke dalam return
pernyataan. Apakah ini sebuah fungsi?
Dan mulai dengan ini, dapatkah kita menebak dengan liar bahwa setiap kata kunci di JavaScript pada akhirnya adalah sebuah fungsi?
Saya telah menulis blog kecil sebagai inti dari diskusi ini. Anda mungkin ingin memeriksanya di sini .
javascript
return
keyword
Arnab Das
sumber
sumber
var a = (2 + 2)
.var a = (1, 2)
- ini akan menghasilkana
nilai2
karena bagaimana operator koma beroperasi (ya, koma adalah operator matematika seperti+
atau|
dll, khususnya, dalam kalkulus lambada, operator koma mengimplementasikan kombinator K)Jawaban:
Itu tidak memiliki tipe, itu bukan nilai.
Mencoba
typeof return;
akan memberi AndaUnexpected token return
.Tidak, meskipun tanda kurung dapat digunakan untuk memanggil suatu fungsi, di sini mereka adalah operator pengelompokan yang berisi beberapa ekspresi yang dipisahkan oleh operator koma .
Demonstrasi yang lebih berguna adalah:
Output mana
0
karena hasila + b
diabaikan (di sebelah kiri operator koma) dana - b
dikembalikan.sumber
return
tidak bisa melihatnya, itulah yang Anda tanyakan.a + b
hanya tidak memiliki efek yang terlihat karena tidak memiliki efek samping dan nilainya akan dibuang (yah, mengingat tidak memiliki efek praktis, mungkin saja kompilator yang mengoptimalkan dapat menghapusnya, tetapi tidak ada perbedaan praktis).if
) adalah evaluasi hubung singkat. Operator koma tidak mengalami korsleting, jadi akan mengevaluasi kedua sisi. Maka itu akan mengembalikan yang terakhir. Itu secara eksplisit adalah tujuan dari operator koma, untuk mengelompokkan ekspresi dalam satu pernyataan (biasanya nilai yang dihasilkan dari seluruh pernyataan diabaikan), paling sering digunakan untuk inisialisasi variabel:var i = 2, j = 3, k = 4;
Saya agak terkejut bahwa tidak ada orang di sini yang secara langsung mereferensikan spesifikasi :
Jadi, karena spesifikasinya, contoh Anda berbunyi:
return ( GetValue(exprRef) )
dimana
exprRef = console.log(a + b), console.log(arguments)
Yang menurut spek pada operator koma ...
... berarti bahwa setiap ekspresi akan dievaluasi hingga item terakhir dalam daftar koma, yang menjadi ekspresi tugas. Jadi kode Anda
return (console.log(a + b) , console.log(arguments))
akan1.) mencetak hasil
a + b
2.) Tidak ada yang tersisa untuk dieksekusi, jadi jalankan ekspresi berikutnya yaitu
3.) mencetak
arguments
, dan karenaconsole.log()
tidak menentukan pernyataan pengembalian4.) Mengevaluasi menjadi tidak terdefinisi
5.) Yang kemudian dikembalikan ke pemanggil.
Jadi jawaban yang benar adalah,
return
tidak memiliki tipe, ini hanya mengembalikan hasil dari beberapa ekspresi.Untuk pertanyaan selanjutnya:
Tidak. Koma dalam JavaScript adalah operator, yang ditentukan untuk memungkinkan Anda menggabungkan beberapa ekspresi menjadi satu baris, dan ditentukan oleh spesifikasi untuk mengembalikan ekspresi yang dievaluasi dari apa pun yang terakhir dalam daftar Anda.
Kamu masih tidak percaya padaku?
Mainkan kode itu di sini dan ubah dengan nilai terakhir dalam daftar. Itu akan selalu mengembalikan nilai terakhir dalam daftar, dalam kasus Anda itu terjadi begitu saja
undefined.
Untuk pertanyaan terakhir Anda,
Sekali lagi tidak. Fungsi memiliki definisi yang sangat spesifik dalam bahasanya. Saya tidak akan mencetak ulang di sini karena jawaban ini sudah menjadi sangat panjang.
sumber
Menguji apa yang terjadi ketika Anda mengembalikan nilai dalam tanda kurung:
Memberikan jawabannya
2
, sehingga tampak bahwa daftar nilai yang dipisahkan koma mengevaluasi ke elemen terakhir dalam daftar.Sungguh, tanda kurung tidak relevan di sini, mereka mengelompokkan operasi alih-alih menandai panggilan fungsi. Namun, yang mungkin mengejutkan adalah bahwa koma legal di sini. Saya menemukan entri blog yang menarik tentang cara menangani koma di sini:
https://javascriptweblog.wordpress.com/2011/04/04/the-javascript-comma-operator/
sumber
return ([1, 2])
harus mencetak kedua nilai?console.log((1, 2))
return
bukanlah sebuah fungsi. Ini adalah kelanjutan dari fungsi tempat terjadinya.Pikirkan tentang pernyataan di
alert (2 * foo(bar));
manafoo
nama suatu fungsi. Saat Anda mengevaluasinya, Anda melihat bahwa Anda harus mengesampingkan pernyataan lainnya sejenak untuk berkonsentrasi pada evaluasifoo(bar)
. Anda dapat memvisualisasikan bagian yang Anda sisihkan sebagai sesuatu sepertialert (2 * _)
, dengan kosong untuk diisi. Ketika Anda tahu apa nilainyafoo(bar)
, Anda mengambilnya lagi.Hal yang Anda sisihkan adalah kelanjutan panggilan
foo(bar)
.Memanggil
return
memberi nilai pada kelanjutan itu.Saat Anda mengevaluasi suatu fungsi di dalam
foo
, sisa waktufoo
menunggu fungsi tersebut berkurang menjadi nilai, lalufoo
mengambilnya kembali. Anda masih punya tujuan untuk mengevaluasifoo(bar)
, itu hanya dijeda.Ketika Anda mengevaluasi
return
di dalamfoo
, tidak ada bagian darifoo
menunggu nilai.return
tidak mengurangi nilai di tempat di dalamfoo
tempat Anda menggunakannya. Alih-alih, hal itu menyebabkan seluruh panggilanfoo(bar)
berkurang menjadi suatu nilai, dan tujuan "evaluasifoo(bar)
" dianggap selesai dan dilenyapkan.Orang biasanya tidak memberi tahu Anda tentang kelanjutan ketika Anda baru mengenal pemrograman. Mereka menganggapnya sebagai topik maju, hanya karena ada yang beberapa hal yang sangat canggih bahwa orang akhirnya melakukan dengan keberlanjutan. Tapi kenyataannya, Anda menggunakannya selama ini, setiap kali Anda memanggil suatu fungsi.
sumber
alert(2 * _)
untuk digunakan nanti dalam Javascript (ada notasi berbeda untuk melakukan hal semacam itu).return
dalamfoo
bukanlah sebuah nilai; Anda tidak dapat mengemasnya dalam struktur data, menetapkannya ke variabel, menunggu beberapa saat dan kemudian memberi makan sesuatu nanti - dan Anda terutama tidak dapat memberinya makan lebih dari sekali. Tapi, seperti yang saya katakan, topik lanjutan.my_if
fungsi yang berperilaku seperti built-inif()then{}else{}
, dan gagal melakukannya bahkan jika Anda membiarkan diri Anda menggunakan built-in di dalamnya - tidak terlalu maju, dan sangat instruktif, terutama jika Anda akan mengakhirinya up dalam kode yang melewati callback.di
return
sini adalah ikan haring merah. Mungkin yang menarik adalah variasi berikut:yang dihasilkan sebagai baris terakhir
karena fungsinya tidak benar-benar mengembalikan apa pun. (Ini akan mengembalikan nilai pengembalian dari detik
console.log
, jika ada).Karena itu, kodenya persis sama dengan
sumber
Cara yang menarik untuk memahami pernyataan return adalah melalui operator void. Lihatlah kode ini
Karena
return
pernyataan tersebut mengambil satu argumen[[expression]]
dan mengembalikan ini ke pemanggil pada stack yaituarguments.callee.caller
kemudian akan dieksekusivoid(expression)
dan kemudian kembaliundefined
itulah evaluasi dari operator void.sumber