Menggunakan fungsi panah ES6 dengan this
pengikatan leksikal sangat bagus.
Namun, saya mengalami masalah beberapa saat yang lalu menggunakannya dengan jQuery click binding yang khas:
class Game {
foo() {
self = this;
this._pads.on('click', function() {
if (self.go) { $(this).addClass('active'); }
});
}
}
Menggunakan fungsi panah sebagai gantinya:
class Game {
foo() {
this._pads.on('click', () => {
if (this.go) { $(this).addClass('active'); }
});
}
}
Dan kemudian $(this)
akan dikonversi ke penutupan tipe ES5 (self = this).
Apakah cara agar Traceur mengabaikan "$ (this)" untuk pengikatan leksikal?
.on()
memang memilikithis
nilai yang berguna bagi Anda. Bagi saya itu jauh lebih jelas denganthis
mengacu pada target acara daripada harus melewati acara dan menemukan target secara manual. Saya belum banyak bermain dengan fungsi panah tetapi sepertinya akan membingungkan untuk bolak-balik dengan fungsi anonim.Jawaban:
Ini tidak ada hubungannya dengan Traceur dan mematikan sesuatu, ini hanyalah cara kerja ES6. Ini adalah fungsi spesifik yang Anda minta dengan menggunakan,
=>
bukanfunction () { }
.Jika Anda ingin menulis ES6, Anda perlu menulis ES6 sepanjang waktu, Anda tidak dapat beralih masuk dan keluarnya pada baris kode tertentu, dan Anda pasti tidak dapat menekan atau mengubah cara
=>
kerjanya. Bahkan jika Anda bisa, Anda hanya akan mendapatkan beberapa versi JavaScript yang aneh yang hanya Anda pahami dan yang tidak akan pernah berfungsi dengan benar di luar Traceur kustom Anda, yang jelas bukan inti dari Traceur.Cara untuk mengatasi masalah khusus ini tidak menggunakan
this
untuk mendapatkan akses ke elemen yang diklik, melainkan menggunakanevent.currentTarget
:jQuery menyediakan
event.currentTarget
secara khusus karena, bahkan sebelum ES6, tidak selalu mungkin bagi jQuery untuk memaksakan athis
pada fungsi callback (yaitu, jika itu terikat ke konteks lain melaluibind
.sumber
.on
panggilan yang didelegasikan ,this
sebenarnyaevent.currentTarget
.this
==event.currentTarget
. Tidak?this
danevent.currentTarget
sama kecualithis
terikat ke lingkup penutup, seperti dengan fungsi panah ES6.Pengikatan acara
Loop
sumber
$jQueryElements.each()
? jQuery sebenarnya mengirimkan beberapa argumen ke setiap objek sehingga Anda tidak memerlukan ini sama sekali => Ini$(...).each((index, el) => console.log(el))
Kasus lain
Jawaban teratas benar dan saya telah memilihnya.
Namun, ada kasus lain:
Bisa diperbaiki sebagai:
Ini adalah kesalahan historis di jQuery yang menempatkan indeks , bukan elemennya sebagai argumen pertama:
Lihat: https://api.jquery.com/each/#each-function
sumber
$('jquery-selector').map
(Ini adalah jawaban yang saya tulis untuk versi lain dari pertanyaan ini, sebelum mempelajarinya adalah duplikat dari pertanyaan ini. Saya pikir jawabannya mengumpulkan informasi dengan cukup jelas sehingga saya memutuskan untuk menambahkannya sebagai wiki komunitas, meskipun sebagian besar hanya berbeda frase dari jawaban lainnya.)
Tidak boleh. Itu setengah dari fungsi panah, mereka menutup alih-
this
alih memiliki sendiri yang diatur oleh bagaimana mereka dipanggil. Untuk kasus penggunaan dalam pertanyaan, jika Anda inginthis
disetel oleh jQuery saat memanggil penangan, penangan haruslahfunction
fungsi.Tapi jika Anda memiliki alasan untuk menggunakan panah (mungkin Anda ingin menggunakan
this
untuk apa artinya luar panah), Anda dapat menggunakane.currentTarget
bukanthis
jika Anda suka:The
currentTarget
pada objek acara adalah sama dengan apa yang jQuery setthis
untuk saat memanggil handler Anda.sumber
Seperti yang dikatakan Meager dalam jawabannya pada pertanyaan yang sama ini Jika Anda ingin menulis ES6, Anda perlu menulis ES6 setiap saat ,
jadi jika Anda menggunakan fungsi panah dari ES6:
(event)=>{}
, maka Anda harus menggunakan$(event.currentTarget)
bukannya$(this)
.Anda juga dapat menggunakan cara yang lebih baik dan lebih bersih untuk menggunakan currentTarget sebagai
({currentTarget})=>{}
,awalnya ide ini dikomentari oleh rizzi frank dalam jawaban @ Meager, dan saya merasa berguna dan menurut saya tidak semua orang akan membaca komentar itu jadi saya telah menuliskannya sebagai jawaban yang lain.
sumber