Bagaimana saya meneruskan konteks setTimeout
? Saya ingin menelepon this.tip.destroy()
jika this.options.destroyOnHide
setelah 1000 ms. Bagaimana saya bisa melakukan itu?
if (this.options.destroyOnHide) {
setTimeout(function() { this.tip.destroy() }, 1000);
}
Ketika saya mencoba di atas, this
merujuk ke jendela.
javascript
callback
this
settimeout
JamesBrownIsDead
sumber
sumber
Jawaban:
EDIT: Singkatnya, pada tahun 2010 ketika pertanyaan ini diajukan, cara paling umum untuk menyelesaikan masalah ini adalah dengan menyimpan referensi ke konteks tempat
setTimeout
pemanggilan fungsi dilakukan, karenasetTimeout
menjalankan fungsi denganthis
menunjuk ke objek global:Dalam spec ES5, baru dirilis setahun sebelum waktu itu, memperkenalkan
bind
metode ini, ini tidak disarankan dalam jawaban asli karena belum didukung secara luas dan Anda memerlukan polyfill untuk menggunakannya tetapi sekarang ada di mana-mana:The
bind
Fungsi menciptakan fungsi baru denganthis
nilai pra-diisi.Sekarang di JS modern, inilah persisnya fungsi-fungsi tanda panah menyelesaikan masalah di ES6 :
Fungsi panah tidak memiliki
this
nilai sendiri, ketika Anda mengaksesnya, Anda mengaksesthis
nilai lingkup leksikal yang dilampirkan.HTML5 juga membuat timer standar pada tahun 2011, dan Anda dapat memberikan argumen sekarang ke fungsi callback:
Lihat juga:
sumber
this
ke fungsi, Anda akan menyelesaikan masalah ini untuk kasus ini, untuk map (), forEach (), dll., menggunakan kode yang lebih sedikit, lebih sedikit siklus CPU, dan lebih sedikit memori. *** Lihat: jawaban Misha Reyzlin.Ada pintasan siap pakai (gula sintaksis) ke fungsi wrapper @CMS dijawab dengan. (Di bawah ini dengan asumsi bahwa konteks yang Anda inginkan adalah
this.tip
.)ECMAScript 5 ( browser saat ini , Node.js) dan Prototype.js
Jika Anda menargetkan browser yang kompatibel dengan ECMA-262, edisi ke-5 (ECMAScript 5) atau Node.js , Anda dapat menggunakannya
Function.prototype.bind
. Anda bisa memberikan argumen fungsi apa pun untuk membuat fungsi parsial .Sekali lagi, dalam kasus Anda, coba ini:
Fungsionalitas yang sama juga telah diterapkan di Prototipe (ada perpustakaan lain?).
Function.prototype.bind
dapat diimplementasikan seperti ini jika Anda ingin kompatibilitas mundur kustom (tapi harap perhatikan catatan).ECMAScript 2015 ( beberapa browser , Node.js 5.0.0+)
Untuk pengembangan mutakhir (2015), Anda dapat menggunakan fungsi panah gemuk , yang merupakan bagian dari spesifikasi ECMAScript 2015 (Harmony / ES6 / ES2015) ( contoh ).
Dalam kasus Anda, coba ini:
jQuery
Jika Anda sudah menggunakan jQuery 1.4+, ada fungsi yang sudah jadi untuk mengatur
this
konteks fungsi secara eksplisit .Dalam kasus Anda, coba ini:
Underscore.js , lodash
Ini tersedia di Underscore.js, serta lodash, seperti
_.bind(...)
1 , 2Dalam kasus Anda, coba ini:
mengikat jquery underscore.js ecmascript-5 prototypejs node.js
sumber
func.bind(context...)
? Apakah saya melewatkan sesuatu?var boundFn = fn.bind(this); boundFn(); boundFn();
misalnya.Di browser selain Internet Explorer, Anda dapat meneruskan parameter ke fungsi bersama setelah penundaan:
Jadi, Anda bisa melakukan ini:
Ini lebih baik dalam hal kinerja daripada pencarian lingkup (caching
this
ke variabel di luar batas waktu / ekspresi interval), dan kemudian membuat penutupan (dengan menggunakan$.proxy
atauFunction.prototype.bind
).Kode untuk membuatnya berfungsi di IEs dari Webreflection :
sumber
CATATAN: Ini tidak akan berfungsi di IE
sumber
Jika Anda menggunakan
underscore
, Anda bisa menggunakanbind
.Misalnya
sumber