Menggunakan metode instan sebagai panggilan balik untuk penangan acara mengubah ruang lingkup this
dari "Contoh saya" menjadi "Apa pun yang disebut dengan panggilan balik" . Jadi kode saya terlihat seperti ini
function MyObject() {
this.doSomething = function() {
...
}
var self = this
$('#foobar').bind('click', function(){
self.doSomethng()
// this.doSomething() would not work here
})
}
Ini bekerja, tetapi apakah itu cara terbaik untuk melakukannya? Itu terlihat aneh bagiku.
javascript
jquery
scope
closures
defnull
sumber
sumber
self
karena adawindow.self
objek dan Anda dapat menggunakannya secara tidak sengaja jika Anda lupa untuk mendeklarasikanself
var Anda sendiri (misalnya ketika memindahkan beberapa kode). Ini bisa menjengkelkan untuk menemukan / men-debug. Lebih baik menggunakan sesuatu seperti_this
.this
dinamis dalam JavaScript. Ini ditentukan saat fungsi dipanggil , bukan saat dideklarasikan."self === this
. Oleh karena itu,self
dalam konteks lokal masuk akal dan mengikuti pola.Jawaban:
Pertanyaan ini tidak khusus untuk jQuery, tetapi khusus untuk JavaScript secara umum. Masalah intinya adalah bagaimana "menyalurkan" variabel dalam fungsi yang disematkan. Ini adalah contohnya:
Teknik ini bergantung pada penggunaan penutupan. Tapi itu tidak berfungsi
this
karenathis
merupakan variabel pseudo yang dapat berubah dari cakupan ke lingkup secara dinamis:Apa yang bisa kita lakukan? Tetapkan ke beberapa variabel dan gunakan melalui alias:
this
tidak unik dalam hal ini:arguments
adalah variabel pseudo lain yang harus diperlakukan dengan cara yang sama - dengan alias.sumber
Ya, ini tampaknya menjadi standar umum. Beberapa coders menggunakan diri sendiri, yang lain menggunakan saya. Ini digunakan sebagai referensi kembali ke objek "nyata" sebagai lawan acara.
Itu adalah sesuatu yang membuat saya sedikit lama untuk benar-benar mengerti, pada awalnya terlihat aneh.
Saya biasanya melakukan ini tepat di atas objek saya (maafkan kode demo saya - itu lebih konseptual daripada yang lain dan bukan pelajaran tentang teknik pengkodean yang sangat baik):
sumber
sunting: meskipun, fungsi bersarang dalam suatu objek mengambil objek jendela global daripada objek di sekitarnya.
sumber
var self = this
dilakukan, tetapi bukan itu pertanyaannya (pertanyaannya adalah apakah itu solusi terbaik untuk masalah itu).Jika Anda melakukan ES2015 atau melakukan skrip jenis dan ES5 maka Anda dapat menggunakan fungsi panah dalam kode Anda dan Anda tidak menghadapi kesalahan itu dan ini merujuk pada ruang lingkup yang Anda inginkan dalam instance Anda.
sumber
this
dari ruang lingkup pendefinisiannya. Definisi fungsi normal tidak melakukan itu.Salah satu solusi untuk ini adalah untuk mengikat semua panggilan balik Anda ke objek Anda dengan
bind
metode javascript .Anda dapat melakukan ini dengan metode bernama,
Atau dengan panggilan balik anonim
Melakukan ini alih-alih
var self = this
menunjukkan Anda memahami bagaimana pengikatanthis
berperilaku dalam javascript dan tidak bergantung pada referensi penutupan.Juga, operator panah gemuk di ES6 pada dasarnya sama dengan memanggil
.bind(this)
fungsi anonim:sumber
Saya belum pernah menggunakan jQuery, tetapi di perpustakaan seperti Prototype Anda dapat mengikat fungsi ke lingkup tertentu. Maka dengan itu dalam pikiran kode Anda akan terlihat seperti ini:
Metode bind mengembalikan fungsi baru yang memanggil metode asli dengan ruang lingkup yang telah Anda tentukan.
sumber
$('#foobar').ready('click', this.doSomething.call(this));
kan?bind
metode tidak bekerja di browser lama, jadi gunakan$.proxy
metode sebagai gantinya.Hanya menambahkan ini bahwa dalam ES6 karena fungsi panah Anda tidak perlu melakukan ini karena mereka menangkap
this
nilainya.sumber
Saya pikir itu sebenarnya tergantung pada apa yang akan Anda lakukan di dalam
doSomething
fungsi Anda . Jika Anda akan mengaksesMyObject
properti menggunakan kata kunci ini maka Anda harus menggunakannya. Tapi saya pikir fragmen kode berikut ini juga akan berfungsi jika Anda tidak melakukan hal-hal khusus menggunakanobject(MyObject)
properti.sumber