Saya telah bereksperimen dengan ES6 untuk sementara waktu sekarang, dan saya baru saja mengalami sedikit masalah.
Saya sangat suka menggunakan fungsi panah, dan kapan pun saya bisa, saya menggunakannya.
Namun, tampaknya Anda tidak dapat mengikatnya!
Inilah fungsinya:
var f = () => console.log(this);
Inilah objek yang ingin saya ikat fungsinya:
var o = {'a': 42};
Dan di sini adalah bagaimana saya akan mengikat f
ke o
:
var fBound = f.bind(o);
Dan kemudian saya bisa menelepon fBound
:
fBound();
Yang akan menampilkan ini ( o
objek):
{'a': 42}
Keren! Menyenangkan! Kecuali itu tidak berhasil. Alih-alih mengeluarkan o
objek, itu menghasilkan window
objek.
Jadi saya ingin tahu: bisakah Anda mengikat fungsi panah? (Dan jika demikian, bagaimana?)
Saya sudah menguji kode di atas di Google Chrome 48 dan Firefox 43, dan hasilnya sama.
javascript
function
ecmascript-6
Florrie
sumber
sumber
this
lingkup induknya.Jawaban:
Anda tidak dapat mem - rebind
this
di fungsi panah. Itu akan selalu didefinisikan sebagai konteks di mana ia didefinisikan. Jika Andathis
harus bermakna, Anda harus menggunakan fungsi normal.Dari ECMAScript 2015 Spec :
sumber
this
. Keduanya terkait, tetapi tidak sama.this
di dalam fungsi panah selalu 'mewarisi'this
dari lingkup melampirkan. Itu adalah fitur fungsi panah. Tapi Anda masih bisabind
semua parameter lain dari fungsi panah. Hanya tidakthis
.Agar lengkap, Anda dapat mengikat kembali fungsi panah, Anda tidak bisa mengubah artinya
this
.bind
masih memiliki nilai untuk argumen fungsi:Cobalah di sini: http://jsbin.com/motihanopi/edit?js,console
sumber
this
(yang, tentu saja, didefinisikan secara leksikal)?Dari MDN :
Ini berarti Anda tidak dapat mengikat nilai
this
seperti yang Anda inginkan.sumber
Selama bertahun-tahun, pengembang js berjuang dengan pengikatan konteks, bertanya mengapa
this
berubah dalam javascript, begitu banyak kebingungan selama bertahun-tahun karena pengikatan konteks dan perbedaan antara maknathis
dalam javascript danthis
di sebagian besar bahasa OOP lainnya.Semua ini membuat saya bertanya, mengapa, mengapa! mengapa Anda tidak ingin mengubah fungsi panah! Yang dibuat khusus untuk menyelesaikan semua masalah dan kebingungan ini dan menghindari keharusan menggunakan
bind
ataucall
atau cara lain apa pun untuk mempertahankan ruang lingkup fungsi.TL; DR
Tidak, Anda tidak dapat me-rebind fungsi panah.
sumber
this
tidak fungsional. lambda seharusnyaarguments => output
. Jika Anda membutuhkan konteks eksternal, sampaikan. Keberadaanthis
inilah yang memfasilitasi semua penyemaian pola OO ke dalam bahasa. Anda tidak akan pernah mendengar istilah "kelas javascript" tanpa itu.this
.Anda tidak dapat menggunakan
bind
untuk mengubah nilaithis
di dalam fungsi panah. Namun, Anda dapat membuat fungsi reguler baru yang melakukan hal yang sama dengan fungsi panah lama dan kemudian menggunakancall
ataubind
untuk mengikat kembalithis
seperti biasa.Kami menggunakan
eval
panggilan di sini untuk membuat kembali fungsi panah yang Anda berikan sebagai fungsi normal dan kemudian gunakancall
untuk memanggilnya dengan yang berbedathis
:sumber
Lakukan Fungsi Panah ES6 Benar-Benar Memecahkan "ini" Dalam JavaScript
Tautan di atas menjelaskan bahwa fungsi panah
this
tidak berubah denganbind, call, apply
fungsi.Ini dijelaskan dengan contoh yang sangat bagus.
jalankan ini
node v4
untuk melihat perilaku "yang diharapkan",sumber
Saya mengajukan pertanyaan yang sama beberapa hari yang lalu.
Anda tidak dapat mengikat nilai karena
this
sudah diikat.Binding berbeda cakupan ini ke ES6 => operator fungsi
sumber
this
juga terikat. Intinya adalah bahwa dalam fungsi panah tidak memiliki ikatan lokal .Pendek, Anda TIDAK BISA mengikat fungsi panah, tetapi baca terus:
Bayangkan Anda memiliki fungsi panah di bawah ini yang dicetak
this
pada konsol:Jadi perbaikan cepat untuk ini akan menggunakan fungsi normal, jadi ubah saja ke:
Kemudian Anda dapat mengikatnya ke lingkungan leksikal menggunakan
bind
ataucall
atauapply
:dan menyebutnya jika
bind
.Ada juga cara menggunakan
eval()
untuk melakukannya, yang sangat tidak dianjurkan .sumber
function myFunc
secara perilaku berbeda dalam cara selain dapat diikat; pertandingan yang lebih dekat akanconst myFunc = function() {...}
. Saya juga ingin tahu apa yang Anda maksudkan dengan menggunakan eval, karena itu adalah pendekatan yang saya pikir tidak ada jawaban yang dibagikan di sini sebelumnya - itu akan menarik untuk melihat bagaimana hal itu dilakukan, dan kemudian membaca mengapa hal itu sangat tidak dianjurkan.Mungkin contoh ini membantu Anda:
sumber