Semua orang tahu tentang this
javascript, tetapi ada juga contoh yang self
ditemui di alam liar, seperti di sini
Jadi, apa perbedaan antara this
dan self
di JavaScript?
javascript
Ben Nelson
sumber
sumber
window.self
(=== window
). Meskipun OP mungkin berarti nama variabel yang sepele ...this === self
benar :-)this
toself
bukanlah praktik yang bagus saat ini ketika sudah umum untuk memiliki kode dengan banyak (yah, lebih dari satu sudah cukup buruk) tingkat callback bersarang, sebagai konsekuensi dari pemrograman asynchronous. Gunakan nama yang lebih deskriptif. Secara obyektif namathis
itu sendiri tidak membawa informasi dan hanya merupakan pilihan nama yang tidak buruk karena konteks leksikal definisi kelas memenuhi syarat itu.Jawaban:
Kecuali mengatur tempat lain, nilai
self
adalahwindow
karena JavaScript memungkinkan Anda mengakses properti apapunx
dariwindow
hanya sebagaix
, bukanwindow.x
. Oleh karena itu,self
sungguhwindow.self
, yang berbeda denganthis
.Jika Anda menggunakan fungsi yang dijalankan dalam cakupan global dan tidak dalam mode ketat,
this
defaultnya kewindow
, dan oleh karena ituJika Anda menggunakan fungsi dalam konteks yang berbeda,
this
akan merujuk ke konteks itu, tetapiself
akan tetapwindow
.Anda dapat menemukan
window.self
definisi dalam draft kerja W3C 2006 untuk Objek Jendela di sini .sumber
self
berguna dalam konteks WebWorker saat jendela tidak dapat diakses ( developer.mozilla.org/en-US/docs/Web/Guide/Performance/… ). Menggunakanself
alih-alihwindow
memungkinkan Anda mengakses objek global dengan cara portabel.Sedikit tambahan untuk ini karena orang mungkin menemukan ini dalam konteks pekerja layanan, dalam hal ini berarti sesuatu yang sedikit berbeda.
Anda mungkin melihat ini di modul pekerja layanan:
Di sini sendiri merujuk ke WorkerGlobalScope, dan ini adalah metode standar untuk menyetel event listener.
Dari dokumen Mozilla :
sumber
Meskipun saya terlambat di sini tetapi saya menemukan satu contoh yang juga dapat membantu untuk dipahami
this
lebih lanjut:O / P
sumber
Referensi ke ECMA 5 perlu diklarifikasi.
Saya berasumsi bahwa ini berarti ECMA-262 Edition 5. Perlu dicatat bahwa ECMA-262 (alias ECMAScript atau, kurang akurat, Javascript) adalah bahasa skrip umum yang telah diterapkan di Browser Internet. Dari standar Edisi 5.1:
Istilah "objek global" mengacu pada objek apa pun yang berada di puncak rantai cakupan. Untuk browser ini akan menjadi objek "jendela" tetapi ini adalah pilihan implementasi (Host Skrip Windows memiliki objek global yang tidak terlihat tetapi tidak ada mode ketat sehingga referensi yang tidak memenuhi syarat mengakses propertinya dan tidak ada "diri" global). Selain itu, "mode ketat" harus diaktifkan secara eksplisit jika tidak, mode ini tidak aktif (bagian 14.1 standar). Dengan demikian, "ini" yang tidak ditentukan akan tetap menyelesaikan objek global (jendela) di "ECMA 5" dengan mode ketat tidak aktif.
Jadi jawaban dari pertanyaannya adalah:
"ini" selalu mengacu pada objek yang menjalankan fungsi. Jika fungsi tidak dipanggil oleh objek (yaitu bukan pemanggilan metode) maka "ini" (seperti yang diteruskan ke fungsi) adalah "tidak ditentukan". Namun, jika TIDAK menggunakan mode ketat maka "ini" yang tidak ditentukan disetel ke objek global (aturan 2 di atas).
"diri" tidak memiliki arti sintaksis khusus, ini hanya sebuah pengenal. Browser cenderung mendefinisikan window.self (hanya properti dari objek jendela global) = window. Ini menghasilkan referensi yang tidak memenuhi syarat untuk "self" yang sama dengan "window" KECUALI "self" telah didefinisikan ulang dalam lingkup yang melingkupi (seperti dengan "var self = this;" di atas. Semoga berhasil mendefinisikan kembali "ini".)
Jadi penjelasan lengkap dari contoh diatas adalah:
Variasi yang menarik dari contoh tersebut membuat penutupan dengan mengembalikan referensi ke fungsi bagian dalam.
Memproduksi
Perhatikan bagaimana fungsi bagian dalam tidak dipanggil sampai dipanggil oleh yourObject. Jadi this.foo sekarang adalah yourObject.foo tetapi self masih menyelesaikan ke variabel dalam lingkup yang melingkupi yang, pada saat objek fungsi bagian dalam dikembalikan, adalah (dan dalam penutupan yang dihasilkan masih) myObject. Jadi, di dalam fungsi bagian dalam, "ini" mengacu pada objek yang memanggil fungsi dalam sedangkan "diri" mengacu pada objek yang disebut fungsi luar untuk membuat referensi ke fungsi dalam.
Untuk meringkas ringkasan ringkasan, "ini" didefinisikan oleh standar bahasa, "diri" didefinisikan oleh siapa pun yang mendefinisikannya (pelaksana runtime atau pemrogram akhir).
sumber
Temukan di bawah ini beberapa kombinasi keluaran konsol 'window', 'self' dan 'this' dalam lingkup global (lingkungan browser) untuk melihat ke mana maksudnya.
sumber