Prinsip kerja ini
Jika suatu fungsi disebut sebagai metode objek, ini akan ditetapkan untuk objek ini.
Salin kode kode sebagai berikut:
var parent = {
Metode: function () {
Console.log (ini);
}
};
parent.method ();
// <-parent
Perhatikan bahwa perilaku ini sangat "rapuh". Ini membingungkan sebagian besar pengembang.
Salin kode kode sebagai berikut:
Thisclowncar ();
// <-window
Ubah ini
Metode .call, .Apply, dan .Bind digunakan untuk mengoperasikan metode fungsi panggilan untuk membantu kami menentukan nilai -nilai ini dan nilai parameter yang diteruskan ke fungsi.
Function.prototype.call dapat memiliki sejumlah parameter.
Salin kode kode sebagai berikut:
Array.prototype.slice.call ([1, 2, 3], 1, 2)
// <- [2]
Function.prototype.apply mirip dengan .call, tetapi parameter yang diteruskan ke fungsi adalah array, bukan parameter apa pun.
String.prototype.split.Apply ('13 .12.02 ', ['. '])
// <- ['13', '12', '02']
Function.prototype.Bind membuat fungsi khusus yang akan selalu menggunakan parameter yang dilewati.
Salin kode kode sebagai berikut:
var arr = [1, 2];
var add = array.prototype.push.bind (arr, 3);
// Secara efektif sama dengan arr.push (3)
menambahkan ();
// Secara efektif sama dengan arr.push (3, 4)
tambahkan (4);
console.log (arr);
// <- [1, 2, 3, 3, 4]
Ini di rantai domain
Dalam contoh berikut, ini tidak akan dapat tetap tidak berubah dalam rantai domain. Ini adalah cacat aturan, dan sering kali membawa kebingungan bagi pengembang amatir.
Salin kode kode sebagai berikut:
Function scoping () {
Console.log (ini);
Return function () {
Console.log (ini);
};
}
scoping () ();
// <-window
// <-window
Ada metode umum untuk membuat variabel lokal untuk mempertahankan referensi ini, dan tidak boleh ada variabel kehidupan dalam domain sub -action. Variabel dengan nama yang sama di sub -scope akan mencakup referensi untuk ini dalam skor induk. http://www.cnblogs.com/sosoft/
Salin kode kode sebagai berikut:
fungsi penahan () {
var seelf = ini;
Return function () {
console.log (self);
};
}
Penahan () ();
// <-window
Kecuali jika Anda benar -benar ingin menggunakan lingkup induk ini pada saat yang sama dan nilai ini saat ini, karena beberapa alasan yang tidak dapat dijelaskan, saya lebih suka menggunakan metode. BID Fungsi. Ini dapat digunakan untuk menentukan ruang lingkup induk untuk menunjuk sub -scope.
Salin kode kode sebagai berikut:
function up () {) {)
Return function () {
Console.log (ini);
} .Bind (ini);
}
merusak () ();
// <-window