Rumah >hujung hadapan web >tutorial js >Bagaimanakah Saya Boleh Menghantar Konteks dengan Betul kepada Panggilan Balik `setTimeout`?

Bagaimanakah Saya Boleh Menghantar Konteks dengan Betul kepada Panggilan Balik `setTimeout`?

Patricia Arquette
Patricia Arquetteasal
2024-12-25 22:25:23287semak imbas

How Can I Correctly Pass Context to a `setTimeout` Callback?

Lepas Konteks ke setTimeout Panggilan Balik

Mengirim konteks yang betul ke setTimeout panggil balik boleh menjadi mencabar, terutamanya apabila bekerja dengan kaedah objek. Pada mulanya, apabila merujuk perkara ini dalam panggilan balik, ia sering membawa kepada objek global digunakan.

Untuk menyelesaikannya, terdapat beberapa pendekatan:

1. Simpan Rujukan (ES5 dan Terdahulu):

var that = this;
if (this.options.destroyOnHide) {
     setTimeout(function() { that.tip.destroy() }, 1000);
}

Teknik ini menggunakan pembolehubah sementara (itu) untuk menyimpan konteks dari mana setTimeout dipanggil.

2 . Kaedah bind (ES5 dan Kemudian):

if (this.options.destroyOnHide) {
     setTimeout(function() { this.tip.destroy() }.bind(this), 1000);
}

Kaedah bind mencipta fungsi baharu dengan nilai ini yang dipratakrifkan. Dalam kes ini, ini ditetapkan kepada objek sebelum memanggil setTimeout.

3. Fungsi Anak Panah (ES6 dan Kemudian):

if (this.options.destroyOnHide) {
     setTimeout(() => { this.tip.destroy() }, 1000);
}

Fungsi anak panah mewarisi konteks leksikalnya ini, yang sama dengan objek yang memanggil setTimeout. Ini menghapuskan keperluan untuk mengikat atau menyimpan ini.

4. Melepasi Argumen kepada setTimeout (HTML5):

if (this.options.destroyOnHide) {
     setTimeout(function(that) { that.tip.destroy() }, 1000, this);
}

HTML5 memperkenalkan ciri dalam setTimeout yang membenarkan menghantar argumen tambahan kepada panggilan balik. Di sini, ini diluluskan sebagai hujah dan diakses dalam fungsi panggil balik.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghantar Konteks dengan Betul kepada Panggilan Balik `setTimeout`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn