Alasan menggunakan a
(0, foo.fn)();
adalah untuk memotong ikatan : this
tidak akan lagi terikat foo
tetapi akan terikat pada objek global.
Tapi apa alasannya mengapa setiap kode JavaScript (atau kode JS Google) ingin memotong ikatannya? (dan apakah itu anti-pola atau tidak?)
javascript
nonopolaritas
sumber
sumber
bind
metode mengikat. Ini hanya perubahan konteks. Anda tidak dapat memotong atau kehilangan ikatan (ikatan dibuat olehbind
).Jawaban:
Jenis kode ini biasanya dihasilkan oleh transpiler (seperti Babel), untuk mengkonversi JavaScript modern - yang menggunakan tambahan spesifikasi terbaru - ke versi JavaScript yang lebih banyak didukung.
Berikut adalah contoh di mana pola transpilasi ini terjadi:
Katakanlah kita memiliki kode asli ini sebelum transpilasi:
Untuk membuat kode yang kompatibel dengan ES5 ini, Anda dapat melakukan ini:
Tetapi di sini kita akan mengeksekusi
myfunc
denganmymodule
sebagaithis
nilai, yang tidak terjadi dalam kode asli. Dan meskipun itu mungkin tidak selalu menjadi masalah, lebih baik untuk memastikan fungsi berperilaku seperti itu dalam versi asli , bahkan jika fungsi itu akan menggunakanthis
referensi - seberapa tidak biasa atau bahkan tidak berguna penggunaanthis
dalammyfunc
mungkin ( karena juga dalam versi aslinya akanundefined
).Jadi misalnya, jika kode asli akan melempar kesalahan karena
this.memberFun()
referensi dalam fungsi, itu juga akan membuang dalam versi yang diubah.Jadi begitulah operator koma digunakan untuk menyingkirkan perbedaan itu:
Memang, dalam kode yang Anda tulis sendiri, Anda tidak akan pernah memiliki kasus penggunaan yang baik untuk pola ini, karena Anda tidak akan menggunakan
this
dimyfunc
di tempat pertama.sumber
require
hubungannya dengan ES6 atau ES5? Dulu saya pikir yang diperlukan adalah modul simpul.require
memang fungsi yang tersedia di node atau disediakan di perpustakaan seperti browserify, require.js, ... dll. Ini tidak secara spesifik terkait dengan ES5 / 6. Di sisi lain, konstruksi bahasa ES6 + sukaimport
tidak dapat di-backport ke ES5 tanpa sesuatu seperti transpilasi.modA.fn1
), maka fungsi-fungsi ini benar-benar tidak boleh digunakanthis
tetapi jika secara tidak sengaja mereka melakukannya, kami tidak inginthis
memengaruhi modul dengan cara apa pun sebagai efek samping, jadi kami memotong pengikatannya, membuatnya berperilaku bagaimana seharusnya berperilaku jika itu adalah fungsi independen