Rumah  >  Artikel  >  hujung hadapan web  >  ini, ini, bincangkan ini dalam javascript sekali lagi, kemahiran javascript yang sangat komprehensif (klasik).

ini, ini, bincangkan ini dalam javascript sekali lagi, kemahiran javascript yang sangat komprehensif (klasik).

WBOY
WBOYasal
2016-05-16 15:21:311286semak imbas

JavaScript ialah bahasa skrip dan oleh itu dianggap oleh ramai sebagai mudah dipelajari. Sebaliknya, JavaScript menyokong ciri lanjutan seperti pengaturcaraan berfungsi, penutupan, warisan berasaskan prototaip dan banyak lagi. Artikel ini hanya mengambil satu contoh: kata kunci ini dalam JavaScript, dan menganalisis maknanya dalam situasi berbeza dengan cara yang mudah dan mudah difahami, sebab untuk situasi ini dan kaedah mengikat ini disediakan oleh alat JavaScript seperti Dojo . Boleh dikatakan bahawa hanya dengan menguasai kata kunci ini dengan betul dalam JavaScript anda boleh memasuki ambang bahasa JavaScript.

Untuk perkara ini dalam js, ramai orang telah menjelaskannya. Ia kelihatan sangat mewah.

Petikan pertama yang lebih mewah daripada Script Home, ya ini

Baiklah, inilah penjelasan saya yang mengecewakan

Argumen: ini bukan pembolehubah, bukan harta dan tidak boleh diberikan nilai Ia sentiasa menunjuk ke objek yang memanggilnya

Rasanya terlalu samar, cuma ingat perkara yang paling penting: "Ia sentiasa menunjuk ke objek yang memanggilnya", jadi jika anda menjumpai objek yang memanggil ini, anda akan tahu kepada siapa ini menunjuk

1

alert(this); 

Lihat, apa yang muncul? Ia sama ada "tetingkap objek" atau "objek".

alert(this === window); 

Hasilnya adalah 'benar', jadi sekarang objek yang memanggilnya ialah tetingkap

2

var test = function(){
  alert(this);
}
test(); 
Teka apa yang muncul di atas, adakah ia sama dengan "amaran(ini)"


var test = function(){
  alert(this === window);
 }
test(); 
Jalankan kod di atas, adakah 'true' muncul?


Adakah ini kesudahannya?


Jika ia sangat mudah, mengapa ramai orang membincangkan burung ini?


3

Datang lagi

var test = function(){
  alert(this === window);
 }
new test(); 
Hei, kenapa kali ini 'palsu'?

Ingat bahawa "ini sentiasa menunjuk ke objek yang memanggilnya". panggilan kepadanya masih "tetingkap" (jangan keliru, walaupun fungsi itu adalah objek, tetapi ia dipanggil oleh objek lain pada "3.", "baru" digunakan sebenarnya berubah. Ini ialah Pembina, pembina mencipta objek kosong baru apabila ia dicipta, iaitu, "ujian baru()" mencipta objek baru, dan kemudian objek ini menunjuk ke kod dalam fungsi "ujian", jadi ini bukan lagi objek tetingkap, tetapi objek baharu yang dicipta oleh pembina ini.


4

Dengan hujah di atas, kini jelas!
var test ={
  'a':1,
  'b':function(){
   alert(this === test)
  }
 }
test.b(); 


5.

jadi, anda tidak fikir keputusan itu "salah", anda silap, walaupun nilai 'test1' ialah 'test', bukankah 'test1' masih menjadi objek 'test', ia mempunyai objek baru, anda faham buat masa ini Mereka dirujuk kepada objek yang sama Berikut adalah kod di bawah sebagai bukti
var test ={
  'a':1,
  'b':function(){
   alert(this === test)
  }
 }
var test1 = test;
test1.b(); 

Jika "1" muncul, datang dan tegur saya
var test ={
  'a':1,
  'b':function(){
   alert(this === test)
  }
 }
var test1 = test;
test.a = 2;
alert(test1.a); 


6. Keseluruhan kompleks

Adakah ini "benar" atau "palsu"?
var test ={
  'a':1,
  'b':{
   'b1':function(){
    alert(this === test);
   }
  }
 }
test.b.b1(); 
Mengikut teori di atas, pada masa ini "ini" tidak lagi dipanggil secara langsung dengan 'ujian', tetapi dengan 'test.b', seperti yang dibuktikan oleh sekeping kod berikut


var test ={
  'a':1,
  'b':{
   'b1':function(){
    alert(this === test.b);
   }
  }
 }
test.b.b1(); 
7. Lebih baik menjadikannya lebih rumit

Tidakkah anda fikir "benar" muncul Menurut teori di atas, 'innerTest' dipanggil dengan 'ujian', dan kemudian 'ini' menunjukkan 'ujian'?
Nah, kesilapan terletak pada siapa yang dipanggil 'innerTest' Sebenarnya, fungsi ini dipanggil oleh objek 'window' Walaupun anda bersarang seribu lapisan, setiap fungsi dipanggil oleh objek 'window' . Sekeping kod sebagai bukti
var test = function(){
  var innerTest = function(){
   alert(this === test);
  }
  innerTest();
 }
test(); 


var test = function(){
  var innerTest = function(){
   alert(this === window);
   var innerTest1 = function(){
    alert(this === window);
   }
   innerTest1();
  }
  innerTest();
 }
test(); 
8 lagi istimewa

Saya rasa semua orang akan meneka dengan betul Fungsi fungsi ini adalah untuk "memanggil kaedah objek dan menggantikan objek semasa dengan objek lain Jadi objek 'tetingkap' telah digantikan dengan 'test1', secara semula jadi ia adalah 'palsu', berikut ialah kod berikut untuk membuktikan
var test = function(){
  alert(this === window);
 }
var test1 = {
}
test.apply(test1); 

Kemudian perkara seperti 'panggilan' akan menjadi serupa
var test = function(){
  alert(this === test1);
 }
 var test1 = {
  }
test.apply(test1); 


9. Satu lagi warisan prototaip, yang berbeza daripada warisan literal

var test = function(){
 }
 var my = function(){
  this.a = function(){
   alert(this === mytest2);
  }
 }
 var mytest = new my();
 test.prototype = mytest;
 var mytest2 = new test();
 mytest2.a(); 
10 yang tinggal, mungkin objek 'dom'

Anda harus faham selepas membaca perkara di atas, 'ini' di dalamnya masing-masing mewakili Shenma

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn