Mengapa ES6 tidak memiliki fungsi panah tipis?

16

ES6 menambahkan fungsi panah-lemak ( =>), yang memiliki dua perbedaan utama dari fungsi normal:

  • sintaksis yang lebih pendek (termasuk pengembalian implisit jika Anda menggunakan satu-ekspresi tubuh)
  • mewarisi thisdari lingkup sekitarnya

Keduanya adalah fitur yang sangat berguna, tetapi bagi saya tampaknya benar-benar terpisah dalam nilai dan aplikasinya - kadang-kadang saya menginginkan satu, atau yang lain, atau keduanya, atau tidak sama sekali. Tampaknya aneh bahwa jika saya ingin menggunakan fungsi pendek sintaks, saya harus juga menggunakan thisperilaku -modifying. Dan sebaliknya. Saya tidak melihat mengapa kedua kemampuan ini diterapkan sebagai tambahan tunggal untuk bahasa tersebut.

Bagaimana jika saya ingin menggunakan fungsi sintaks pendek untuk pengembalian implisit dan singkatnya (dalam beberapa konteks di mana penuh function (..) { return ...}akan sedikit kurang terbaca), tetapi saya ingin menggunakan thisdalam fungsi saya untuk merujuk ke konteks panggilan? Tidak ada cara untuk melakukan ini.

CoffeeScript memiliki fungsi keduanya ->dan =>style, dan tampaknya ES6 meminjam =>style dari sana. Jadi pertanyaan saya adalah, mengapa ES6 juga tidak meminjam ->gaya?

callum
sumber
fungsi fat-arrow memiliki perbedaan lain, seperti mereka tidak dapat mengikat argumentskeduanya.
DeadMG
Jika terkadang yang Anda inginkan adalah ruang lingkup di sekitarnya, Anda selalu dapat mengikat thiske penutupan dalam deklarasi fungsi penuh. Ini mungkin bukan bagian yang Anda khawatirkan.
Ben

Jawaban:

25

Lihat proposal untuk menambahkan fungsi panah: http://wiki.ecmascript.org/doku.php?id=harmony:arrow_function_syntax 1

Apa yang dikatakannya adalah:

Namun, kami tidak ingin CoffeeScript's ->, itu membingungkan untuk memiliki dua panah dan dinamis mengikat ini adalah senapan yang sering dipecat.

Anda juga dapat melihat beberapa diskusi tentang versi proposal sebelumnya yang memang memiliki -> sintaks juga: https://esdiscuss.org/topic/arrow-function-syntax-simplified

Tampaknya turun sebagai berikut:

  1. Memiliki dua sintaks panah dengan semantik yang sedikit berbeda akan meningkatkan komplikasi dan kebingungan.
  2. Dinamika ini mengikat fungsi () dan ->dianggap jarang berguna, dan merupakan senjata kaki.
  3. Jika Anda benar-benar membutuhkan dinamis pengikatan ini, Anda masih dapat menggunakan function (), memiliki sintaks pintasan tidak terlalu membantu.
Winston Ewert
sumber
1
+1. Perhatikan secara spesifik bahwa ES6 adalah upaya kedua untuk memperkenalkan fitur-fitur ini, yang awalnya direncanakan untuk dimasukkan dalam ES4, tetapi spesifikasi tersebut ditinggalkan ketika menjadi jelas bahwa para pemangku kepentingan utama menganggapnya terlalu rumit dan cenderung merusak kompatibilitas. Menjaga semuanya sesederhana mungkin pasti menjadi tujuan penting bagi komite saat ini.
Jules
1
Terima kasih atas jawaban Anda, tetapi saya rasa itu tidak mencakupnya. Lebih sedikit bukan berarti lebih sederhana; Saya berpendapat bahwa lebih kompleks harus beralih antara dua sintaks fungsi yang sangat berbeda hanya untuk mendapatkan logika yang mengikat ini berbeda (dibandingkan dengan beralih satu karakter tunggal). Memiliki "berbagai jenis fungsi dengan semantik yang berbeda-beda" bukanlah ide yang buruk; sebenarnya apa yang kita miliki sebenarnya. Dan saya tidak melihat apa hubungannya kompatibilitas dengan apa yang kita bicarakan. Saya tidak menyarankan mereka harus menghapus dukungan untuk sintaks fungsi klasik, jika itu yang Anda maksud
callum
2
@cum, konsensus (setidaknya di antara orang-orang yang membuat keputusan ini) adalah function()gaya yang mengikat ini adalah kesalahan dan merupakan kutil pada bahasa. Jika mereka bisa, mereka akan berubah function()menjadi =>semantik, tetapi mereka tidak bisa karena itu akan merusak kompatibilitas.
Winston Ewert
2
@ WinstonEwert bertahan, apakah Anda mengatakan orang-orang yang membuat keputusan akan lebih suka jika mereka bisa berubah function()untuk mewarisi thisdari lingkup sekitarnya seperti =>halnya? Dalam hal itu, bukankah thishanya merujuk ke objek global di mana saja? Kedengarannya aneh. Di mana Anda mendengar itu?
callum
3
Ini mungkin memiliki jawaban yang diterima, tetapi sepertinya desain bahasa yang buruk. Jika Anda memiliki bahasa yang membutuhkan panah gemuk, maka panah tipis juga harus tersedia. Yang pertama memaksa setiap orang untuk mulai berpikir dalam hal objek, sedangkan yang terakhir mengakui sejarah javascripts dari desain fungsional terlebih dahulu, dan konteks ditangguhkan.
Inti