Saya mempunyai pembina yang mendaftarkan pengendali acara:
function MyConstructor(data, transport) { this.data = data; transport.on('data', function () { alert(this.data); }); } // Mock transport object var transport = { on: function(event, callback) { setTimeout(callback, 1000); } }; // called as var obj = new MyConstructor('foo', transport);
Walau bagaimanapun, saya tidak boleh mengakses objek yang dibuat di dalam panggilan balik data
属性。看起来 this
yang tidak merujuk kepada objek yang dicipta tetapi kepada objek lain.
Saya juga cuba menggunakan kaedah objek dan bukannya fungsi tanpa nama:
function MyConstructor(data, transport) { this.data = data; transport.on('data', this.alert); } MyConstructor.prototype.alert = function() { alert(this.name); };
Tetapi ia juga mempunyai masalah yang sama.
Bagaimana untuk mengakses objek yang betul?
Berikut ialah beberapa cara untuk mengakses konteks ibu bapa dalam konteks kanak-kanak - H2>- Anda boleh menggunakan fungsi
- Simpan rujukan kepada konteks/ini dalam pembolehubah lain (lihat contoh di bawah).
- Menggunakan fungsi ES6 anak panah.
- Tukar kod, reka bentuk berfungsi dan seni bina - untuk ini anda harus menguasai Corak Reka Bentuk a> dalam JavaScript.
绑定 a>()
.1.Gunakan
bind()
fungsiJika anda menggunakan Underscore.js - http://underscorejs.org/#bind
2 Simpan rujukan kepada konteks/ini dalam pembolehubah lain
3.Fungsi anak panah
Mengenai
此内容您应该了解
this
(aka "konteks") ialah kata kunci khas dalam setiap fungsi yang nilainya bergantung hanya pada bagaimana fungsi dipanggil, bukan bagaimana/bila/di mana ia ditakrifkan. Ia tidak dipengaruhi oleh skop leksikal seperti pembolehubah lain (kecuali fungsi anak panah, lihat di bawah). Berikut adalah beberapa contoh:Untuk mengetahui lebih lanjut tentang
此
, lihat 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
dilihat dalam skop sama seperti pembolehubah biasa. Ini bermakna anda tidak perlu memanggilthis
绑定。相反,this
就像普通变量一样在范围内查找。这意味着您不必调用.bind
mengikat mereka sendiri. Sebaliknya,.bind
. Ini bukan satu-satunya tingkah laku istimewa mereka, lihat dokumentasi MDN untuk mendapatkan maklumat lanjut.这个
Jangan gunathis
,而是访问它引用的对象。这就是为什么一个简单的解决方案是简单地创建一个也引用该对象的新变量。变量可以有任何名称,但常见的是self
和that
Anda sebenarnya tidak mahu mengaksesakses objek yang dirujuknya
self
是一个普通变量,因此它遵循词法范围规则并且可以在回调内部访问。这还有一个优点,即您可以访问回调本身的this
. Itulah sebabnya penyelesaian mudah adalah dengan hanya mencipta pembolehubah baharu yang juga merujuk objek. Pembolehubah boleh mempunyai sebarang nama, tetapi yang biasa ialahdiri
danthat
.Memandangkan
self
ialah pembolehubah biasa, ia mengikut peraturan skop leksikal dan boleh diakses di dalam panggilan balik. Ini juga mempunyai kelebihan iaitu anda boleh mengakses nilaithis
panggilan balik itu sendiri.Menetapkan panggilan balik secara eksplisit
this
- Bahagian 1Nampaknya anda tidak mempunyai kawalan ke atas nilai kerana nilainya ditetapkan secara automatik, tetapi sebenarnya tidak begitu.
Setiap fungsi mempunyai kaedah.bind
[docs],它返回一个新函数,其中this
绑定到一个值。该函数与您调用.bind
的函数具有完全相同的行为,只是this
是由您设置的。无论何时或如何调用该函数,this
.bind
[docs]this
绑定到MyConstructor
的this
, yang mengembalikan fungsi baharu dengan terikat pada nilai. Fungsi ini mempunyai gelagat yang sama seperti fungsi yang anda panggil
🎜🎜Nota: 🎜Apabila mengikat konteks ke jQuery, gunakan 🎜🎜 🎜🎜[docs]🎜🎜🎜 sebaliknya. Sebab untuk ini adalah supaya anda tidak perlu menyimpan rujukan kepada fungsi apabila membatalkan ikatan panggilan balik acara. jQuery mengendalikan ini secara dalaman. 🎜.bind
, kecualijQuery .proxy
ditetapkan oleh anda. Tidak kira bila atau bagaimana fungsi dipanggil, akan sentiasa merujuk kepada nilai yang diluluskan. Dalam contoh ini, kami mengikat panggilan balik kepada nilaiMyConstructor
's .Menyediakan panggilan balik
this
- Bahagian 2Sesetengah fungsi/kaedah yang menerima panggilan balik juga menerima nilai yang
this
应该引用的值。这与您自己绑定它基本上相同,但是函数/方法会为您完成它。Array#map
harus dirujuk oleh panggilan balik. Ini pada asasnya sama seperti mengikatnya sendiri, tetapi fungsi/kaedah melakukannya untuk anda.Array#map
[docs]Ini kaedahnya. Tandatangannya ialah:Parameter pertama ialah panggilan balik dan parameter kedua ialah nilai
this
harus dirujuk. Berikut ialah contoh rekaan: