Cara untuk mengakses objek `ini` dengan betul dalam fungsi panggil balik
P粉608647033
2023-08-20 16:11:32
<p>Saya mempunyai pembina yang mendaftarkan pengendali acara: </p>
<p><br /></p>
<pre class="snippet-code-js lang-js prettyprint-override"><kod>fungsi MyConstructor(data, pengangkutan) {
ini.data = data;
transport.on('data', fungsi () {
alert(this.data);
});
}
//Simulasikan objek pemindahan
pengangkutan var = {
on: function(event, callback) {
setTimeout(panggilan balik, 1000);
}
};
// Kaedah panggilan
var obj = MyConstructor('foo', transport);</code></pre>
<p><br /></p>
<p>Walau bagaimanapun, dalam fungsi panggil balik saya tidak boleh mengakses sifat <kod>data</code> Nampaknya <kod>ini</kod> tidak menghala ke objek yang dicipta, tetapi ke objek lain. </p>
<p>Saya juga cuba menggunakan kaedah objek dan bukannya fungsi tanpa nama: </p>
<pre class="brush:php;toolbar:false;">function MyConstructor(data, transport) {
ini.data = data;
transport.on('data', this.alert);
}
MyConstructor.prototype.alert = function() {
makluman(nama.ini);
};</pre>
<p>Tetapi ia juga mempunyai masalah yang sama. </p>
<p>Bagaimanakah saya boleh mengakses objek yang betul? </p>
Berikut ialah beberapa cara untuk mengakses konteks ibu bapa dalam konteks kanak-kanak:
bind()
.1. Guna
bind()
fungsiJika anda menggunakan Underscore.js - http://underscorejs.org/#bind
2 Simpan rujukan konteks/ini dalam pembolehubah lain
3. Fungsi anak panah
Pengetahuan tentang
this
this
(juga dipanggil "konteks") ialah kata kunci khas di dalam setiap fungsi yang nilainya bergantung hanya pada cara fungsi dipanggil, bukan bagaimana ia ditakrifkan. Ia tidak dipengaruhi oleh skop leksikal, tidak seperti pembolehubah lain (kecuali fungsi anak panah, lihat di bawah). Berikut adalah beberapa contoh:Untuk mengetahui lebih lanjut tentang
this
, sila rujuk dokumentasi MDN.Cara petik yang betul
this
Gunakan fungsi anak panah
ECMAScript 6 memperkenalkan fungsi anak panah, yang boleh dianggap sebagai fungsi lambda. Mereka tidak mempunyai ikatan
dilihat dalam skop, sama seperti pembolehubah biasa. Ini bermakna anda tidak perlu memanggilthis
绑定。相反,this
在作用域中查找,就像普通变量一样。这意味着你不需要调用.bind
mereka sendiri. Sebaliknya,.bind
. Mereka juga mempunyai tingkah laku istimewa lain, lihat dokumentasi MDN untuk maklumat lanjut.this
Tidak digunakanthis
,而是需要访问它所指的对象。因此,一个简单的解决方案是创建一个新变量,也指向该对象。变量可以有任何名称,但常见的是self
和that
Sebenarnya, anda tidak perlu mengaksesdiri
danthat
.self
是一个普通变量,它遵循词法作用域规则,并且可以在回调函数内部访问。这还有一个优点,即可以访问回调函数本身的this
Memandangkanself
ialah pembolehubah biasa, ia mengikut peraturan skop leksikal dan boleh diakses di dalam fungsi panggil balik. Ini juga mempunyai kelebihan untuk mempunyai akses kepada nilai fungsi panggil balik itu sendiri.this
Menetapkan fungsi panggil balik secara eksplisitthis
Nampaknya anda tidak mempunyai kawalan ke atas nilaiSetiap fungsi mempunyai kaedah.bind
.bind
[文档],它返回一个将this
绑定到一个值的新函数。该函数的行为与你调用.bind
时的函数完全相同,只是this
由你设置。无论如何或何时调用该函数,this
[docs]
this
绑定到MyConstructor
的this
, yang mengembalikan fungsi baharu yang mengikat kepada nilai. Gelagat fungsi ini adalah sama seperti semasa anda memanggil
Untuk konteks mengikat jQuery, gunakan 🎜🎜 🎜🎜[Dokumentasi]🎜🎜🎜. Sebab untuk ini ialah tidak perlu menyimpan rujukan kepada fungsi apabila menyahikat panggilan balik acara. jQuery mengendalikan ini secara dalaman. 🎜.bind
, kecuali ia ditetapkan oleh anda. Tidak kira atau apabila fungsi dipanggil, akan sentiasa merujuk kepada nilai yang diluluskan.jQuery.proxy
Dalam kes ini, kami mengikat fungsi panggil balik kepada nilaiMyConstructor
. Nota:Sediakan fungsi panggil balik
this
- Bahagian 2Sesetengah fungsi/kaedah yang menerima fungsi panggil balik juga menerima nilai yang harus digunakan sebagai
this
。这与手动绑定相同,但是函数/方法会为你执行绑定。例如,Array#map
fungsi panggil balik. Ini adalah sama seperti pengikatan manual, tetapi fungsi/kaedah melaksanakan pengikatan untuk anda. Contohnya,Array#map kod > [Dokumentasi]
Ini kaedahnya. Tandatangannya ialah:Parameter pertama ialah fungsi panggil balik, dan parameter kedua ialah nilai yang
this
sepatutnya dirujuk. Berikut ialah contoh rekaan:Nota: Sama ada boleh lulus nilai
this
的值通常在函数/方法的文档中提到。例如,jQuery的$.ajax
方法 [文档]描述了一个名为context
biasanya disebut dalam dokumentasi fungsi/kaedah. Contohnya, kaedah$.ajax
jQuery[Dokumentasi]
Penerangan Pilihan yang dipanggilkonteks :
this.method
被分配为点击事件处理程序,但是如果点击document.body
,记录的值将是undefined
,因为在事件处理程序内部,this
指的是document.body
,而不是Foo
Satu lagi manifestasi biasa masalah ini ialah menggunakan kaedah objek sebagai panggilan balik/pengendali acara. Dalam JavaScript, fungsi adalah warga kelas pertama, dan istilah "kaedah" hanya merujuk kepada fungsi yang merupakan nilai harta objek. Tetapi tidak ada pautan khusus antara fungsi dan objek "mengandungi"nya.this
Pertimbangkan contoh berikut: Fungsithis.method
diperuntukkan sebagai pengendali acara klik, tetapi jikadocument.body
diklik, nilai yang direkodkan akan menjadiundefined
kerana dalam Di dalam pengendali acara, merujuk kepadadocument.body
, bukan contohFoo
. Seperti yang dinyatakan sebelum ini,merujuk kepada bagaimana fungsi
, bukan bagaimana ditakrifkan .
.bind
将this
Ia mungkin lebih jelas jika kod kelihatan seperti ini:🎜Penyelesaian 🎜 adalah sama seperti yang dinyatakan di atas: gunakan
🎜Atau dengan menggunakan fungsi tanpa nama sebagai panggilan balik/acara.bind
untuk mengikat secara eksplisit 🎜 kepada nilai tertentu 🎜 jika tersedia