Sebelum menyebutkan konsep di atas, pertama-tama saya ingin berbicara tentang parameter implisit fungsi dalam JavaScript: argumen Argumen
Objek
ini mewakili parameter fungsi yang dijalankan dan fungsi yang memanggilnya.
[fungsi.]argumen[n]
Fungsi parameter: opsi. Nama objek Fungsi yang sedang dijalankan. n: pilihan. Indeks nilai parameter berbasis 0 yang akan diteruskan ke objek Fungsi.
Deskripsi
Argumen adalah objek tersembunyi yang dibuat selain parameter yang ditentukan saat memanggil suatu fungsi. Argumen adalah objek yang mirip dengan array tetapi bukan array. Dikatakan mirip dengan array karena memiliki properti akses dan metode yang sama dengan array. Nilai parameter tunggal yang sesuai dapat diakses melalui argumen[ n], dan memiliki atribut panjang array. Selain itu, objek argumen menyimpan parameter yang sebenarnya diteruskan ke fungsi, tidak terbatas pada daftar parameter yang ditentukan oleh deklarasi fungsi, dan objek argumen tidak dapat dibuat secara eksplisit. Objek argumen hanya tersedia di awal fungsi. Contoh berikut merinci properti ini:
//Penggunaan objek argumen.
fungsi Uji Arg(a, b){
var i, s = "Fungsi ArgTest diharapkan ";
var numargs = argument.length; // Dapatkan nilai argumen yang diteruskan.
var expargs = ArgTest.length; // Dapatkan nilai parameter yang diharapkan.
jika (exparg < 2)
s += expargs + " argumen. ";
kalau tidak
s += expargs + " argumen. ";
jika (angka < 2)
s += angka + " telah berlalu.";
kalau tidak
s += angka + "lulus.";
s += "nn"
for (i =0; i < numargs; i++){ // Dapatkan konten parameter.
s += " Arg " + i + " = " + argumen[i] + "n";
}
return(s); // Kembalikan daftar parameter.
}
Di sini ditambahkan kode yang menyatakan bahwa argumen bukan array (kelas Array):
Array.prototipe.nilai diri = 1;
peringatan(Array baru().nilai diri);
fungsi testAguments(){
alert(argumen.nilai diri);
}
Jalankan kode dan Anda akan menemukan bahwa peringatan pertama menampilkan 1, yang berarti bahwa objek array memiliki atribut nilai mandiri dengan nilai 1. Saat Anda memanggil fungsi testAguments, Anda akan menemukan bahwa "tidak terdefinisi" ditampilkan, yang menunjukkan bahwa ini bukan atribut argumen. Artinya, argumen bukanlah objek array.
penelepon
Mengembalikan referensi ke fungsi yang memanggil fungsi saat ini.
nama fungsi.pemanggil
Objek functionName adalah nama fungsi yang dieksekusi.
Perhatikan bahwa untuk fungsi, atribut pemanggil hanya ditentukan saat fungsi dijalankan. Jika fungsi dipanggil dari tingkat atas, pemanggil berisi null. Jika atribut pemanggil digunakan dalam konteks string, hasilnya sama dengan functionName.toString, yaitu teks fungsi yang didekompilasi akan ditampilkan.
Contoh berikut mengilustrasikan penggunaan atribut pemanggil:
// caller demo {
fungsi pemanggilDemo() {
if (callerDemo.caller) {
var a= pemanggilDemo.caller.toString();
peringatan(a);
} kalau tidak {
alert("ini adalah fungsi teratas");
}
}
fungsi handleCaller() {
pemanggilDemo();
}
callee
mengembalikan objek Fungsi yang sedang dieksekusi, yang merupakan isi dari objek Fungsi yang ditentukan.
[fungsi.]argumen.callee
Parameter fungsi opsional adalah nama objek Fungsi yang sedang dijalankan.
Perhatikan bahwa
nilai awal atribut callee adalah objek Fungsi yang dieksekusi.
Atribut callee adalah anggota objek argumen. Ini mewakili referensi ke objek fungsi itu sendiri, yang bermanfaat untuk rekursi fungsi anonim atau untuk memastikan enkapsulasi fungsi angka dari 1 sampai n. Properti ini hanya tersedia ketika fungsi yang relevan sedang dijalankan. Perlu juga dicatat bahwa callee memiliki atribut panjang, yang terkadang lebih baik untuk verifikasi. argument.length adalah panjang parameter sebenarnya, dan argument.callee.length adalah panjang parameter formal. Dari sini, Anda dapat menentukan apakah panjang parameter formal konsisten dengan panjang parameter sebenarnya selama panggilan.
Contoh
//callee dapat mencetak sendiri
fungsi calleeDemo() {
alert(argumen.callee);
}
//Digunakan untuk memverifikasi parameter
fungsi calleeLengthDemo(arg1, arg2) {
if (argumen.panjang==argumen.callee.panjang) {
window.alert("Pastikan panjang parameter formal dan aktual sudah benar!");
kembali;
} kalau tidak {
alert("Panjang parameter sebenarnya: " +arguments.length);
alert("Panjang parameter formal: " +arguments.callee.length);
}
}
//Perhitungan rekursif
var jumlah = fungsi(n){
jika (n <= 0)
kembali 1;
kalau tidak
kembalikan n + argumen.callee(n - 1)
}
Fungsi rekursif yang lebih umum:
var sum = function(n){
jika (1==n) kembalikan 1;
else return n + sum (n-1);
Saat menelepon: alert(sum(100));
Fungsi tersebut berisi referensi untuk menjumlahkan dirinya sendiri. Nama fungsi hanyalah nama variabel. Memanggil jumlah di dalam fungsi sama dengan memanggil variabel global. Ini tidak dapat mencerminkan pemanggilannya sendiri perbandingan. Pendekatan yang bagus.
apply dan call
adalah untuk mengikat suatu fungsi ke objek lain untuk dioperasikan. Satu-satunya perbedaan di antara keduanya adalah cara mendefinisikan parameter:
apply(thisArg,argArray);
call(thisArg[,arg1,arg2...] ]) ;
Artinya, penunjuk this di dalam semua fungsi akan diberi nilai thisArg, yang dapat mencapai tujuan menjalankan fungsi sebagai metode objek lain.
Penjelasan Apply
adalah jika argArray bukan array yang valid atau bukan argumen objek, itu akan menyebabkan TypeError.
Jika argArray atau thisArg tidak disediakan, objek Global akan digunakan sebagai thisArg.
dan tidak ada parameter yang dapat dilewati.
Deskripsi panggilan
Metode panggilan mengubah konteks objek suatu fungsi dari konteks awal ke objek baru yang ditentukan oleh thisArg.
Jika parameter thisArg tidak disediakan, maka objek Global digunakan sebagai thisArg.
Tips terkait:
Ada trik lain dalam menerapkan panggilan dan penerapan. Yaitu, setelah menggunakan panggilan dan penerapan untuk menerapkan fungsi lain (kelas), fungsi saat ini ( kelas) akan tersedia. Metode atau properti dari fungsi lain (kelas) juga bisa disebut "warisan". Perhatikan contoh berikut:
// Demonstrasi pewarisan
basis fungsi() {
this.member = "dnnsun_Member";
ini.metode = fungsi() {
window.alert(ini.anggota);
}
}
fungsi memperluas() {
base.call(ini);
window.alert(anggota);
window.alert(ini.metode);
}
Seperti yang dapat dilihat dari contoh di atas, extend dapat mewarisi metode dan properti base setelah pemanggilan.
Ngomong-ngomong, apply digunakan dalam prototipe kerangka JavaScript untuk membuat pola
yang mendefinisikan sebuah kelas. Kode implementasinya adalah sebagai berikut:
var Class = {
buat: fungsi() {
fungsi kembali() {
this.initialize.apply(ini, argumen);
}
}
}
Analisis: Dari sudut pandang kode, objek ini hanya berisi satu metode: Buat, yang mengembalikan suatu fungsi, yaitu kelas. Tapi ini juga merupakan konstruktor kelas, yang memanggil inisialisasi, dan metode ini adalah fungsi inisialisasi yang ditentukan saat kelas dibuat. Dengan cara ini,
Anda dapat mengimplementasikan contoh mode pembuatan kelas di prototype
:
var vehicle=Class.create();
kendaraan.prototipe={
inisialisasi:fungsi(tipe){
this.type=tipe;
}
showSelf:fungsi(){
alert("Kendaraan ini adalah "+ this.type);
}
}
var moto=kendaraan baru("Moto");
moto.showSelf();
Untuk informasi lebih detail mengenai prototipe tersebut, silakan kunjungi situs resminya.
http://www.cnblogs.com/sunwangji/archive/2006/08/21/482341.html