Di JavaScritp, ini tidak selalu merupakan satu -satunya konteks metode objek, dan ini juga disebut dalam panggilan fungsi global dan beberapa konteks lain yang berbeda.
Ini bisa menjadi objek global, objek saat ini, atau objek apa pun, tergantung sepenuhnya pada bagaimana fungsi disebut. Ada beberapa cara untuk memanggil fungsi di JavaScript: sebagai metode objek panggilan, sebagai panggilan fungsi, sebagai panggilan konstruktor, dan menggunakan panggilan apply atau panggilan.
1. Panggilan sebagai metode objek
Dalam JavaScript, fungsi juga merupakan objek, sehingga fungsi dapat digunakan sebagai atribut suatu objek.
Salinan kode adalah sebagai berikut:
var point = {
x: 0,
Y: 0,
moveto: function (x, y) {
this.x = this.x + x;
this.y = this.y + y;
}
};
point.moveto (1, 1) // ini berikatan dengan objek saat ini, yaitu objek titik
2. Sebagai panggilan fungsi
Fungsi ini juga dapat dipanggil secara langsung, dan ini terikat pada objek global. Di browser, jendela adalah objek global. Sebagai contoh, contoh berikut: Ketika suatu fungsi dipanggil, ini terikat pada objek global, dan pernyataan penugasan dieksekusi selanjutnya, yang setara dengan secara implisit menyatakan variabel global, yang jelas bukan yang diinginkan penelepon.
Salinan kode adalah sebagai berikut:
fungsi makeNoSense (x) {
this.x = x;
}
Makenosense (5);
x; // x telah menjadi variabel global dengan nilai 5
Untuk fungsi internal, yaitu, fungsi yang dinyatakan dalam tubuh fungsi lain, cara mengikat objek global ini akan menciptakan masalah lain. Kami akan menggunakan objek titik yang disebutkan sebelumnya sebagai contoh. Hasilnya mungkin tidak terduga.
Salinan kode adalah sebagai berikut:
var point = {
x: 0,
Y: 0,
moveto: function (x, y) {
// Fungsi internal
var movex = function (x) {
This.x = x; // Di mana ini terikat?
};
// Fungsi internal
var movey = function (y) {
this.y = y; // Di mana ini terikat?
};
movex (x);
Movey (Y);
}
};
point.moveto (1, 1);
point.x; // ==> 0
point.y; // ==> 0
x;
y;
Ini adalah cacat desain dari JavaScript.
Salinan kode adalah sebagai berikut:
var point = {
x: 0,
Y: 0,
moveto: function (x, y) {
var itu = ini;
// Fungsi internal
var movex = function (x) {
itu.x = x;
};
// Fungsi internal
var movey = function (y) {
itu.y = y;
}
movex (x);
Movey (Y);
}
};
point.moveto (1, 1);
point.x; // ==> 1
point.y; // ==> 1
Disebut sebagai konstruktor
JavaScript mendukung pemrograman berorientasi objek. Sejalan dengan itu, konstruktor dalam JavaScript juga sangat istimewa. Sebagai aturan konvensional lainnya, konstruktor dimulai dengan huruf kapital untuk mengingatkan penelepon untuk memanggil dengan cara yang benar. Jika panggilan itu benar, ini terikat pada objek yang baru dibuat.
Salinan kode adalah sebagai berikut:
titik fungsi (x, y) {
this.x = x;
this.y = y;
}
Dipanggil menggunakan Apply atau Call
Mari kita tegaskan kembali bahwa dalam fungsi JavaScript juga merupakan objek, objek memiliki metode, dan menerapkan dan panggilan adalah metode objek fungsi. Kedua metode ini sangat kuat, dan memungkinkan pengalihan konteks eksekusi fungsi, yaitu objek yang terikat pada ini. Metode ini digunakan dalam banyak teknik JavaScript dan perpustakaan kelas. Mari kita lihat contoh spesifik:
Salinan kode adalah sebagai berikut:
titik fungsi (x, y) {
this.x = x;
this.y = y;
this.moveto = function (x, y) {
this.x = x;
this.y = y;
}
}
var p1 = titik baru (0, 0);
var p2 = {x: 0, y: 0};
p1.moveto (1, 1);
p1.moveto.Apply (P2, [10, 10]);
Dalam contoh di atas, kami menggunakan konstruktor untuk menghasilkan objek P1, yang juga memiliki metode MOVETO; Panggilan metode lain juga memiliki fungsi yang sama, perbedaannya adalah bahwa parameter terakhir tidak dilewati dengan seragam sebagai array, tetapi dilewatkan secara terpisah.
Salinan kode adalah sebagai berikut:
fungsi foo () {
//1. Konstruktor yang direferensikan ini adalah objek yang dirujuk oleh Argument.callee
// Instruksi adalah konstruktor yang dieksekusi melalui operator baru
if (this.constructor == arguments.callee) {
alert ('objek dibuat');
}
//2. ini jendela, maka itu adalah panggilan global
if (this == window) {
waspada ('panggilan normal');
}
lain {// 3.
alert ('dipanggil oleh'+ this.constructor);
}
}
Foo (); // panggilan fungsi global
Foo.call (objek baru ()); // Panggilan sebagai metode anggota objek objek
foo baru (); // dipanggil oleh operator baru untuk menjalankan konstruksi objek