Dari dokumen saya mengerti bahwa .proxy()
akan mengubah ruang lingkup fungsi yang dilewatkan sebagai argumen. Bisakah seseorang tolong jelaskan saya ini lebih baik? Kenapa kita harus melakukan ini?
javascript
jquery
Aditya Shukla
sumber
sumber
Jawaban:
Apa yang akhirnya dilakukan adalah memastikan bahwa nilai
this
dalam suatu fungsi akan menjadi nilai yang Anda inginkan.Contoh umum adalah dalam
setTimeout
yang terjadi di dalamclick
pawang.Ambil ini:
Niatnya cukup sederhana. Ketika
myElement
diklik, itu harus mendapatkan kelasaNewClass
. Di dalam pawangthis
mewakili elemen yang diklik.Tetapi bagaimana jika kita ingin penundaan singkat sebelum menambahkan kelas? Kita mungkin menggunakan a
setTimeout
untuk mencapainya, tetapi masalahnya adalah bahwa fungsi apa pun yang kita berikansetTimeout
, nilaithis
di dalam fungsi itu akanwindow
bukan elemen kita.Jadi yang bisa kita lakukan sebagai gantinya adalah memanggil
$.proxy()
, mengirimkannya fungsi dan nilai yang ingin kita tetapkanthis
, dan itu akan mengembalikan fungsi yang akan mempertahankan nilai itu.Jadi setelah kami memberikan
$.proxy()
fungsi, dan nilai yang kami inginkanthis
, mengembalikan fungsi yang akan memastikan bahwathis
diatur dengan benar.Bagaimana cara melakukannya? Itu hanya mengembalikan fungsi anonim yang memanggil fungsi kami menggunakan
.apply()
metode, yang memungkinkannya secara eksplisit mengatur nilaithis
.Tampilan yang disederhanakan pada fungsi yang dikembalikan mungkin terlihat seperti:
Jadi fungsi anonim ini diberikan
setTimeout
, dan semua yang dilakukannya adalah menjalankan fungsi asli kami denganthis
konteks yang tepat .sumber
$.proxy(function () {...}, this)
daripada(function() {...}).call(this)
? Apakah ada perbedaan?.call
Anda memanggil fungsi segera. Dengan$.proxy
, itu seperti diFunction.prototype.bind
mana ia mengembalikan fungsi baru. Fungsi baru itu memilikithis
nilai yang terikat secara permanen, sehingga ketika diteruskan kesetTimeout
, dansetTimeout
memanggil fungsi nanti, ia akan tetap memiliki nilai yang benarthis
.Tanpa masuk ke detail yang lebih besar (yang diperlukan karena ini adalah tentang Konteks dalam ECMAScript, variabel konteks ini, dll.)
Ada tiga jenis "Konteks" dalam ECMA- / Javascript:
Setiap kode dieksekusi dalam konteks eksekusi . Ada satu konteks global dan ada banyak contoh konteks fungsi (dan eval). Sekarang bagian yang menarik:
Setiap panggilan fungsi masuk ke konteks eksekusi fungsi. Konteks eksekusi dari suatu fungsi terlihat seperti:
Aktivasi Obyek
Lingkup Rantai
nilai ini
Jadi nilai ini adalah objek khusus yang terkait dengan konteks eksekusi. Ada dua fungsi dalam ECMA- / Javascript yang dapat mengubah nilai ini dalam konteks eksekusi fungsi:
Jika kami memiliki fungsi,
foobar()
kami dapat mengubah nilai ini dengan memanggil:Sekarang kita bisa mengakses
foobar
objek yang kita lewati:Inilah tepatnya yang
jQuery.proxy()
dilakukannya. Dibutuhkan afunction
dancontext
(yang tidak lain adalah objek) dan menautkan fungsi dengan memanggil.call()
atau.apply()
mengembalikan fungsi baru tersebut.sumber
Saya telah menulis fungsi ini:
sumber
Tujuan yang sama dapat dicapai dengan menggunakan "Segera-dipanggil Fungsi Ekspresi, singkat: Iife"
fungsi mengeksekusi diri:sumber