Pertama -tama, harus dikatakan bahwa penunjuk ini tidak dapat ditentukan ketika fungsi didefinisikan. Hanya ketika fungsi dieksekusi, hal ini dapat terjadi pada siapa titik ini. Faktanya, ini pada akhirnya menunjuk pada objek yang menyebutnya (ada beberapa masalah dalam kalimat ini, dan kami akan menjelaskan mengapa ada masalah nanti. Meskipun sebagian besar artikel di internet mengatakan ini, meskipun tidak akan ada masalah dalam memahaminya seperti itu dalam banyak kasus, sebenarnya tidak akurat untuk memahaminya, jadi Anda akan merasa bahwa Anda tidak dapat mengetahuinya ketika Anda memahami ini). Kemudian saya akan membahas masalah ini secara mendalam berikutnya.
Mengapa mempelajari ini? Jika Anda telah belajar pemrograman fungsional dan pemrograman berorientasi objek, Anda harus tahu apa yang harus dilakukan. Jika Anda belum mempelajarinya, Anda tidak perlu membaca artikel ini untuk saat ini. Tentu saja, jika Anda tertarik, Anda juga dapat membacanya. Lagi pula, ini adalah sesuatu yang harus dikuasai dalam JS.
Contoh 1:
fungsi a () {var user = "little j"; console.log (this.user); // console.log yang tidak ditentukan (ini); // window} a ();Menurut apa yang kami katakan di atas, ini pada akhirnya menunjuk pada objek yang menyebutnya. Fungsi A di sini sebenarnya ditunjukkan oleh objek jendela, dan kode berikut dapat membuktikannya.
fungsi a () {var user = "little j"; console.log (this.user); // console.log yang tidak ditentukan (ini); } window.a () // jendelaSama seperti kode di atas, peringatan sebenarnya adalah properti jendela, dan juga ditunjukkan berdasarkan jendela.
Contoh 2:
var o = {user: "Chasing Dreams", fn: function () {console.log (this.user); // mengejar mimpi}} o.fn ();Ini di sini menunjuk pada objek o, karena Anda menyebutnya FN dan menjalankannya melalui O.Fn (), sehingga titik alami adalah objek o. Saya ingin menekankan lagi di sini bahwa pointing ini tidak dapat diputuskan ketika fungsi dibuat, dan hanya dapat diputuskan ketika dipanggil. Siapa pun yang menyebutnya akan menunjukkan kepada siapa, Anda harus mengetahuinya.
Bahkan, Contoh 1 dan Contoh 2 tidak cukup akurat. Contoh berikut dapat membalikkan teori di atas.
Jika Anda ingin memahami ini secara menyeluruh, Anda harus melihat beberapa contoh berikutnya.
Contoh 3:
var o = {user: "Catching Dreams", fn: function () {console.log (this.user); // Catching Dreams}} window.o.fn ();Kode ini hampir sama dengan kode di atas, tetapi mengapa ini menunjuk ke jendela? Jika Anda mengikuti teori di atas, titik ini ke objek yang menyebutnya. Izinkan saya mengatakan sesuatu yang lain di sini. Windows adalah objek global di JS. Variabel yang kami buat sebenarnya menambahkan atribut ke jendela, sehingga Anda dapat menggunakan jendela untuk mengarahkan objek O di sini.
Saya tidak akan menjelaskan mengapa kode di atas ini tidak menunjuk ke jendela. Mari kita lihat kode lain.
var o = {a: 10, b: {a: 12, fn: function () {console.log (this.a); // 12}}} obfn ();Ini juga ditunjukkan oleh Object O, tetapi ini tidak melaksanakannya, jadi Anda pasti akan mengatakan bahwa apa yang saya katakan di awal itu semua salah? Sebenarnya, bukan, hanya saja itu tidak akurat pada awalnya. Selanjutnya, saya akan menambahkan satu kalimat. Saya yakin Anda dapat benar -benar memahami masalah yang ditunjukkan oleh hal ini.
=========================================================================== >>>>
Kasus 1 : Jika ada ini dalam suatu fungsi, tetapi tidak dipanggil oleh objek di level sebelumnya, maka ini menunjuk ke jendela. Apa yang perlu dijelaskan di sini adalah bahwa dalam versi JS yang ketat, ini menunjuk ke jendela, tetapi kami tidak akan membahas masalah versi ketat di sini. Jika Anda ingin tahu, Anda dapat mencari secara online sendiri.
=========================================================================== >>>>
Kasus 2 : Jika ada ini dalam suatu fungsi dan fungsi ini dipanggil oleh objek di level sebelumnya, maka ini menunjuk ke objek pada level sebelumnya.
=========================================================================== >>>>
Kasus 3: Jika ada ini dalam suatu fungsi, fungsi ini berisi banyak objek. Meskipun fungsi ini disebut oleh objek terluar, ini hanya menunjuk ke objek di level berikutnya. Contoh 3 dapat membuktikan bahwa jika Anda tidak percaya, maka mari kita terus lihat beberapa contoh selanjutnya.
var o = {a: 10, b: {// a: 12, fn: function () {console.log (this.a); // tidak terdefinisi}}} obfn ();Meskipun tidak ada atribut A dalam objek B, ini juga menunjuk pada Object B, karena ini hanya akan menunjuk pada objek sebelumnya, terlepas dari apakah ada sesuatu yang diinginkan dalam objek ini.
Ada kasus khusus lain, Contoh 4:
var o = {a: 10, b: {a: 12, fn: function () {console.log (this.a); // console.log yang tidak ditentukan (ini); // window}}} var j = obfn; j ();Ini menunjuk ke jendela di sini, bukankah itu sedikit membingungkan? Faktanya, itu karena Anda tidak memahami kalimat, yang juga penting.
Ini selalu menunjuk pada objek yang menyebutnya terakhir, yang berarti siapa yang menyebutnya ketika dieksekusi. Dalam Contoh 4, meskipun fungsi FN dirujuk oleh Objek B, itu tidak dieksekusi saat menetapkan Fn ke variabel J, sehingga pada akhirnya menunjuk ke jendela, yang berbeda dari Contoh 3. Contoh 3 secara langsung mengeksekusi FN.
Ini sebenarnya hanya itu, tetapi titiknya akan berbeda dalam keadaan yang berbeda. Ringkasan di atas adalah sedikit kesalahan di setiap tempat, dan tidak dapat dikatakan sebagai kesalahan, tetapi situasinya akan berbeda di lingkungan yang berbeda, jadi saya tidak bisa menjelaskannya dengan jelas sekaligus, jadi Anda hanya bisa mengalaminya perlahan.
Versi Konstruktor Ini:
function fn () {this.user = "small j";} var a = new fn (); console.log (a.user); // Small J.Alasan mengapa objek A dapat menunjukkan pengguna dalam fungsi FN di sini adalah karena kata kunci baru dapat mengubah arah ini dan mengarahkan ini ke objek a. Mengapa saya mengatakan adalah objek? Karena menggunakan kata kunci baru adalah membuat instance objek. Memahami kalimat ini, Anda dapat memikirkan contoh kami 3. Kami menggunakan variabel A untuk membuat instance FN (setara dengan menyalin FN ke objek A). Pada saat ini, itu baru saja dibuat dan tidak dieksekusi. Panggilan ke fungsi ini FN adalah objek A, jadi ini secara alami objek a. Jadi mengapa ada pengguna di objek FN? Karena Anda telah menyalin fungsi FN ke objek A, dan menggunakan kata kunci baru setara dengan menyalin salinan.
Selain hal di atas, kita juga dapat mengubah arah ini sendiri ========== >>> Panggilan, terapkan, ikat
Perbarui masalah kecil saat pertemuan ini kembali
function fn () {this.user = 'Small J'; kembali {}; } var a = fn baru; console.log (a.user); //belum diartikanLihat satu lagi
function fn () {this.user = 'Small J'; return function () {};} var a = fn baru; console.log (a.user); //belum diartikanDatang lagi
function fn () {this.user = 'Small J'; return 1;} var a = fn baru; console.log (a.user); // JFungsi kecil fn () {this.user = 'Small J'; return tidak terdefinisi;} var a = fn baru; console.log (a.user); // Small J.Jika nilai pengembalian adalah objek, maka ini menunjuk ke objek yang dikembalikan. Jika nilai pengembalian bukan objek, maka ini masih menunjuk ke instance fungsi.
function fn () {this.user = 'Small J'; return tidak terdefinisi;} var a = fn baru; console.log (a); // fn {user: "Small J"}Poin lain adalah bahwa meskipun null juga merupakan objek, ini masih menunjuk ke contoh fungsi itu di sini, karena null lebih istimewa.
function fn () {this.user = 'Small J'; return null;} var a = fn baru; console.log (a.user); // Small J.Poin Pengetahuan Tambahan:
1. Default ini dalam versi ketat bukan lagi jendela, tetapi tidak ditentukan.
2. Operator baru akan mengubah masalah penunjuk fungsi ini. Meskipun kami telah menjelaskannya di atas, kami belum membahas masalah ini secara mendalam. Jarang disebutkan di internet, jadi perlu membicarakannya di sini.
fungsi fn () {this.num = 1;} var a = fn baru (); console.log (a.num); // 1Mengapa ini menunjuk ke A? Pertama, kata kunci baru akan membuat objek kosong, dan kemudian metode Function Apply akan secara otomatis dipanggil untuk mengarahkan ini ke objek kosong ini. Dengan cara ini, ini di dalam fungsi akan digantikan oleh objek kosong ini.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.