Dalam file JavaScript yang saya lihat:
function Somefunction(){
var that = this;
...
}
Apa tujuan menyatakan that
dan menugaskannya this
?
javascript
this
Chris
sumber
sumber
Jawaban:
Saya akan memulai jawaban ini dengan ilustrasi:
Jawaban saya awalnya menunjukkan ini dengan jQuery, yang hanya sedikit berbeda:
Karena
this
sering berubah ketika Anda mengubah ruang lingkup dengan memanggil fungsi baru, Anda tidak dapat mengakses nilai asli dengan menggunakannya. Mengurangkannya untukthat
memungkinkan Anda masih mengakses nilai aslithis
.Secara pribadi, saya tidak suka menggunakan
that
sebagai alias. Jarang jelas apa yang dimaksud, terutama jika fungsinya lebih panjang dari beberapa baris. Saya selalu menggunakan alias yang lebih deskriptif. Dalam contoh saya di atas, saya mungkin akan menggunakanclickedEl
.sumber
var self = this;
. Kata ituthat
sepertinya menyiratkan bahwa variabel itu adalah APA PUNthis
.forEach
fungsi mengambil argumen kedua yaitu opsional yang pengikatan fungsi.colours.forEach(function(){/* 'this' is bound correctly --> */}, this);
Jadi catatan harus ditambahkan yang sebenarnyavar that = this
tidak diperlukan .forEach
Dari Crockford
JS Fiddle
Lansiran ini ...
sumber
that
variabel tidak digunakan dalam contohnya sama sekali. Itu membuatnya tampak seolah-olah hanya membuat holding variabelthis
melakukan sesuatu ke seluruh kode.Ini adalah retasan untuk membuat fungsi-fungsi dalam (fungsi-fungsi yang didefinisikan di dalam fungsi-fungsi lain) bekerja lebih seperti seharusnya. Dalam javascript ketika Anda mendefinisikan satu fungsi di dalam yang lain
this
secara otomatis diatur ke lingkup global. Ini bisa membingungkan karena Anda berharapthis
memiliki nilai yang sama dengan fungsi luar.Ini secara khusus merupakan masalah ketika Anda membuat fungsi sebagai metode suatu objek (seperti
car.start
pada contoh) kemudian membuat fungsi di dalam metode tersebut (sepertiactivateStarter
). Dalam metode tingkat atasthis
menunjuk ke objek itu adalah metode (dalam kasus ini,car
) tetapi dalam fungsi batinthis
sekarang menunjuk ke lingkup global. Ini menyakitkan.Membuat variabel untuk digunakan oleh konvensi di kedua cakupan adalah solusi untuk masalah yang sangat umum ini dengan javascript (meskipun itu berguna dalam fungsi jquery juga). Inilah sebabnya mengapa nama terdengar yang sangat umum
that
digunakan. Ini adalah konvensi yang mudah dikenali untuk mengatasi kekurangan dalam bahasa.Seperti petunjuk El Ronnoco pada Douglas Crockford berpikir ini adalah ide yang bagus.
sumber
Penggunaan
that
tidak benar-benar diperlukan jika Anda membuat solusi dengan penggunaancall()
atauapply()
:sumber
Terkadang
this
dapat merujuk ke ruang lingkup lain dan merujuk ke sesuatu yang lain, misalnya misalkan Anda ingin memanggil metode konstruktor di dalam peristiwa DOM, dalam hal inithis
akan merujuk ke elemen DOM bukan objek yang dibuat.HTML
JS
Demo
Solusi di atas akan mengasumsikan
this
untukthat
kemudian kita dapat dan mengakses properti nama di dalamsayHi
metode darithat
, jadi ini dapat dipanggil tanpa masalah di dalam panggilan DOM.Solusi lain adalah dengan menetapkan
that
objek kosong dan menambahkan properti dan metode padanya lalu mengembalikannya. Tetapi dengan solusi ini Anda kehilanganprototype
konstruktor.sumber
Berikut ini contohnya `
Sehingga Anda dapat melihat bahwa nilai ini adalah dua nilai yang berbeda tergantung pada elemen DOM yang Anda targetkan tetapi ketika Anda menambahkan "itu" ke kode di atas Anda mengubah nilai "ini" yang Anda targetkan.
..... $ (itu) .css ("warna latar belakang", "# ffe700"); // Di sini nilai "itu" adalah ".our-work-group> p> a" karena nilai var yang = ini; jadi meskipun kita berada di "this" = '.our-work-single-page', kita masih dapat menggunakan "itu" untuk memanipulasi elemen DOM sebelumnya.
sumber