Dalam JavaScript, jika fungsi tersebut milik suatu objek, perilaku mengakses fungsi melalui objek disebut "panggilan metode". Tidak seperti panggilan fungsi biasa, saat membuat panggilan metode, referensi ini dalam fungsi akan berubah - ini akan merujuk pada objek yang digunakan untuk memanggil fungsi (objek ini akan menjadi konteks doa dari panggilan metode):
Salinan kode adalah sebagai berikut:
var x = 99;
var sample = {
X: 1,
Act: function (a) {
this.x = a*a; // Tetapkan nilai ke sampel x, bukan objek global x.
}
}
sampel.act (6);
console.log (sample.x); // 36
console.log (x); // 99
Seperti mengakses properti di objek, selain menggunakan operator DOT, JavaScript juga dapat menggunakan operator braket untuk membuat panggilan metode:
Salinan kode adalah sebagai berikut:
// Cara lain untuk memohon metode
sampel ["act"] (7);
console.log (sample.x); // 49
Untuk fungsi dalam JavaScript, perilaku yang menarik adalah menanamkan fungsi (penutupan) dalam fungsi. Saat membuat panggilan metode, jika ada fungsi tertanam dalam fungsi metode, kode dalam fungsi tertanam ini dapat mengakses nilai variabel eksternal:
Salinan kode adalah sebagai berikut:
// Fungsi bersarang dapat mengakses variabel di luarnya.
var y = 88;
var sample2 = {
Y: 1,
Act2: function (a) {
this.y = inner ();
function inner () {
mengembalikan a*a;
}
}
}
sampel2.act2 (8);
console.log (sample2.y); // 64
console.log (y); // 88
Namun, bertentangan dengan intuisi, kode yang tertanam dalam fungsi tidak dapat mewarisi ini dari luar; yaitu, dalam fungsi tertanam, ini tidak merujuk pada objek yang memanggil metode, tetapi pada objek global:
Salinan kode adalah sebagai berikut:
// Fungsi bersarang tidak mewarisi "ini". "Ini" dalam fungsi bersarang adalah objek global
var sample3 = {
Act3: function () {
batin();
function inner () {
console.log (this); // objek jendela
}
}
}
sampel3.act3 ();
Jika Anda benar -benar perlu mengakses objek yang memanggil metode dalam fungsi tertanam, Anda dapat menyimpan nilai ini ke dalam variabel dalam fungsi eksternal:
Salinan kode adalah sebagai berikut:
// lulus "ini" ke fungsi bersarang
var sample4 = {
Act4: function () {
var self = ini;
batin();
function inner () {
console.log (self); // objek {act4 = function ()}
}
}
}
sampel4.act4 ();