ini
Apabila fungsi dilaksanakan, ini sentiasa menunjuk kepada objek yang dipanggil fungsi itu. Untuk menentukan di mana titik ini, anda sebenarnya perlu menentukan milik siapa fungsi ini.
Dalam buku "The Essence of JavaScript Language", senario di mana ini muncul dibahagikan kepada empat kategori secara ringkas:
Jika ada objek, tuding pada objek yang memanggil
Tuding pada objek global tanpa memanggil objek
Dibina dengan baharu, ia menunjuk kepada objek baharu
Tukar rujukan ini melalui apply atau call atau bind.
1) Apabila fungsi mempunyai objek yang dimiliki: tuding ke objek yang dimiliki
Apabila fungsi mempunyai objek yang menjadi miliknya, ia biasanya dipanggil melalui ungkapan , dalam keadaan ini secara semula jadi ia menunjuk ke objek yang dimilikinya. Contohnya, contoh berikut:
var myObject = {value: 100}; myObject.getValue = function () { console.log(this.value); // 输出 100 // 输出 { value: 100, getValue: [Function] }, // 其实就是 myObject 对象本身 console.log(this); return this.value; }; console.log(myObject.getValue()); // => 100
getValue() tergolong dalam objek myObject dan dipanggil .
2) Fungsi tidak mempunyai objek pemilikan: menunjuk ke objek global
var myObject = {value: 100}; myObject.getValue = function () { var foo = function () { console.log(this.value) // => undefined console.log(this);// 输出全局对象 global }; foo(); return this.value; }; console.log(myObject.getValue()); // => 100
Dalam blok kod di atas, walaupun fungsi foo ditakrifkan dalam badan fungsi getValue, ia sebenarnya bukan milik getValue mahupun myObject. foo tidak terikat pada mana-mana objek, jadi apabila dipanggil, penunjuk ini menunjuk ke objek global.
Dikatakan bahawa ini adalah kesilapan reka bentuk.
3) ini dalam pembina: menunjuk ke objek baharu
Dalam js, kami memanggil pembina melalui kata kunci baharu, dan ini akan terikat pada objek baharu.
var SomeClass = function(){ this.value = 100; } var myCreate = new SomeClass(); console.log(myCreate.value); // 输出100
Dengan cara ini, dalam js, tiada sempadan yang jelas antara pembina, fungsi biasa, kaedah objek dan penutupan. Sempadan semuanya ada dalam hati manusia.
4) gunakan dan panggil panggilan dan ikat ikatan: tuding ke objek terikat
Kaedah apply() menerima dua parameter Yang pertama ialah skop di mana fungsi berjalan, dan satu lagi ialah tatasusunan parameter (argumen).
Maksud parameter pertama kaedah call() adalah sama seperti kaedah apply(), kecuali parameter lain perlu disenaraikan satu demi satu.
Ringkasnya, kaedah panggilan adalah lebih dekat dengan cara biasa kita memanggil fungsi, manakala aplikasi memerlukan kita menghantar tatasusunan dalam bentuk Tatasusunan kepadanya. Mereka boleh ditukar ganti.
var myObject = {value: 100}; var foo = function(){ console.log(this); }; foo(); // 全局变量 global foo.apply(myObject); // { value: 100 } foo.call(myObject); // { value: 100 } var newFoo = foo.bind(myObject); newFoo(); // { value: 100 }
Itu sahaja kandungan artikel ini, saya harap anda semua menyukainya.