Di tempat lain , sebuah argumen telah muncul tentang terminologi fungsi bernama di CoffeeScript. Secara khusus seseorang menyebut sesuatu seperti ini:
foo = ->
console.log("bar")
sebagai fungsi bernama. Tapi sudah keberatan bahwa semua yang ada di CoffeeScript adalah fungsi anonim dan tidak ada fungsi bernama. Ini memang benar, CoffeeScript hanya memiliki ekspresi fungsi yang kemudian dapat disimpan dalam variabel. Tapi saya tidak berpikir itu berarti salah menyebut fungsi ini namanya.
Seperti yang saya lihat, itu adalah fungsi yang dinamai karena fungsi yang telah diberi nama. Benar, ini bukan fungsi bernama dengan cara yang sama seperti beberapa bahasa lain telah menamai fungsi, tapi saya pikir cukup dekat sehingga tidak pantas untuk menyebutnya fungsi bernama. Menegaskan sebaliknya hanya tampaknya menjadi rewel.
Apakah saya keluar untuk makan siang dengan berpikir bahwa bersikeras bahwa ini bukan fungsi yang disebut hanya pemalsuan?
sumber
foo = ->
hanya fungsi lama, sementaraclass Foo
konstruktor. Saya tidak melihat alasan mengapafoo = ->
harus disebut anonim.Jawaban:
CoffeeScript pasti terikat dengan JavaScript, dan JavaScript membedakan antara ekspresi berikut:
Bahkan, Anda bahkan dapat menulis:
Karena perbedaan ini penting dalam JavaScript, masuk akal untuk menggunakan istilah yang sama ketika berbicara tentang CoffeeScript. Namun, CoffeeScript tidak mendukung apa pun seperti
function foo ()
sintaks, jadi kita dapat mengatakan itu tidak memiliki fungsi "bernama".Dalam arti tertentu, nama adalah bagian dari definisi fungsi di
function foo() { ... }
, di mana dalam kasus lain Anda hanya membuat fungsi dan menetapkannya ke variabel. Ini tercermin, misalnya, dalamname
properti fungsi (tidak standar) : dalam kasus pertama,foo.name
akan memberi Anda"foo"
dan yang kedua akan memberi Anda""
.Selain itu, dalam JavaScript, ini juga berbeda dalam hal bagaimana mereka diperkenalkan ke ruang lingkup: versi pertama "diangkat" dan tersedia di seluruh cakupannya di mana definisi kedua hanya tersedia setelah ditetapkan.
Pada dasarnya, anggap saja sebagai jargon khusus JavaScript, yang ditransfer ke CoffeeScript karena CoffeeScript sangat erat kaitannya dengan JS.
sumber
function foo () {}
. Namun, Anda masih dapat menginisialisasi fungsi bernama melaluiclass
konstruk. Hanya saja CoffeeScript yang dikompilasi (JavaScript yang dihasilkan) jauh lebih bertele-tele daripada bagaimana kebanyakan orang akan menulis fungsi yang dinamai.foo
tubuh fungsi Anda tidak akan diangkat.class foo
Badan fungsi Anda tidak akan diangkat ke bagian atas file.Perlu dicatat bahwa pengguna secara eksplisit menyatakan bahwa mereka mengubah "fungsi anonim menjadi fungsi bernama", kedua istilah memiliki makna yang kuat dan sudah ada, serta fungsi yang sangat berbeda di dunia JavaScript. Mengingat makna yang ada, mereka tidak melakukan hal seperti itu, dan saya menunjukkan ini.
CoffeeScript tidak sejauh ini dihapus dari JavaScript sehingga Anda harus mendefinisikan kembali istilah yang mereka berdua bagi untuk berarti sesuatu yang lain dalam satu bahasa. CoffeeScript tidak ada di beberapa gelembung, dihapus dari implementasi JavaScript-nya seperti Anda mungkin berpendapat bahwa C ++ dipisahkan dari Assembly. Mengetahui perbedaan antara fungsi anonim dan fungsi bernama penting , karena jika Anda mengharapkan fungsi CoffeeScript "bernama" Anda berperilaku seperti fungsi bernama sebenarnya , Anda akan kecewa:
JavaScript yang setara akan bekerja dengan baik, dengan fungsi bernama sebenarnya :
Anda mungkin benar bahwa saya hanya "nitpicking", tetapi jadi apa? Poin halus dalam hal pemrograman komputer , dan menjadi "secara teknis" benar adalah penting. Perbedaan antara menulis kode yang bekerja, dan benar-benar memahami mengapa kode Anda benar .
sumber
Tidak. Bagaimanapun, dalam hal semantik, referensi fungsi Anda disimpan dalam variabel, yang dapat Anda rujuk melalui nama variabel .
sumber
Jelas bukan nitpick, imo. Saya menggunakannya secara luas untuk keterbacaan:
Jadi:
Fungsi bernama sebenarnya dalam "naskah kopi"
Anda lolos dari JS murni melalui backtick `
Perhatikan bahwa Anda tidak dapat membuat indent pada badan fungsi Anda.
Bersulang
sumber
Jangan buang waktu berdebat dengan pedant. Tidak pernah berhasil. Ya, semua orang tahu apa yang Anda maksud dengan "fungsi bernama" di CoffeeScript, meskipun secara teknis salah. Tidak, menggunakan terminologi yang secara teknis keliru tetapi dipahami secara luas tidak ada kaitannya dengan kebenaran atau kesalahan dari solusi yang diusulkan. Apakah mungkin untuk lebih tepat tanpa mendapatkan kecanggungan dalam pengungkapan kata? Mungkin tidak. Namun, itu tidak berarti orang akan membiarkannya. Bayangkan saja orang ini di ujung percakapan.
Alasannya secara teknis salah adalah karena Anda belum menyebutkan fungsi, Anda telah menyebutkan referensi ke fungsi tersebut. Mempertimbangkan:
Apa nama fungsinya?
foo
danbar
keduanya merujuk fungsi yang sama, tetapi memiliki nama yang berbeda. Selain itu, baikfoo
ataubar
dapat ditugaskan kembali kapan saja untuk referensi fungsi yang berbeda, atau bahkan tipe yang berbeda sama sekali, tanpa mengubah fungsi itu sendiri.sumber
Jadi, cara saya membaca ini seperti ini:
Saat Anda mendeklarasikan fungsi dalam konsol JavaScript menggunakan
dan kemudian memanggil
foo
tanpa tanda kurung, ia kembaliNamun, jika Anda mendefinisikannya menggunakan
dan kemudian memohon
foo
lagi tanpa tanda kurung, ia kembaliDalam kasus pertama, saya akan mengatakan Anda mendeklarasikan variabel bernama "foo" menyimpan fungsi anonim di dalamnya. Dalam kasus kedua, saya akan mengatakan Anda sebenarnya mendeklarasikan fungsi bernama bernama "foo".
Karena CoffeeScript menggunakan pola pertama, saya setuju bahwa secara teknis benar bahwa fungsi CoffeeScript adalah semua fungsi anonim yang disimpan dalam variabel bernama.
sumber