Objek Function ECMAScript (kelas)

Fungsi ECMAScript sebenarnya adalah objek yang lengkap.

Objek Function (kelas)

Yang paling menarik tentang ECMAScript mungkin adalah fungsi sebenarnya adalah objek yang lengkap.

Function kelas boleh mewakili mana-mana fungsi yang ditakrifkan pengembang.

语法 untuk mencipta fungsi melalui Function kelas adalah seperti ini:

var function_name = new function()arg1, arg2, ... , argN, function_body)

dalam bentuk di atas, setiap arg semua parameter, parameter terakhir adalah badan fungsi (perintah untuk dijalankan). Parameter ini mesti string.

Ingatkan fungsi ini di bawah:

function sayHi(sName, sMessage) {
  alert("Hello " + sName + sMessage);
}

boleh diwarti seperti ini:

var sayHi 
= 
new Function("sName", "sMessage", "alert(\"Hello \" + sName + sMessage);");

Walaupun disebabkan oleh string, bentuk ini sukar untuk ditulis, tetapi membantu memahami bahawa fungsi hanya jenis referensi, dan mereka bertindak seperti fungsi yang dibuat secara jelas dengan Function class.

Lihat contoh di bawah ini:

function doAdd(iNum) {
  alert(iNum + 20);
}
function doAdd(iNum) {
  alert(iNum + 10);
}
doAdd(10);	//keluarkan "20"

Seperti yang diketahui, fungsi kedua menge overload fungsi pertama, sehingga doAdd(10) mengeluarkan "20", bukannya "30".

Jika mengulangi kod blok ini dalam bentuk berikut, konsep ini akan jelas:

var doAdd = new Function("iNum", "alert(iNum + 20)");
var doAdd = new Function("iNum", "alert(iNum + 10)");
doAdd(10);

Lihat kod ini, jelaslah, nilai doAdd diubah kepada penunjuk kepada objek yang berbeza. Nama fungsi hanya referensi kepada objek fungsi, bertindak seperti objek lain. bahkan boleh mendapat dua pembolehubah yang menunjuk ke fungsi yang sama:

var doAdd = new Function("iNum", "alert(iNum + 10)");
var alsodoAdd = doAdd;
doAdd(10);	//keluarkan "20"
alsodoAdd(10);	//keluarkan "20"

Di sini, pembolehubah doAdd diwarti sebagai fungsi, lalu alsodoAdd diumumkan untuk menunjuk ke fungsi yang sama. Kedua-dua pembolehubah ini boleh dilakukan kod fungsi dan mengeluarkan hasil yang sama - "20". Jadi, jika nama fungsi hanya menunjuk kepada pembolehubah fungsi, apakah boleh membawa fungsi sebagai parameter kepada fungsi lain? Jawapan adalah Ya!

function callAnotherFunc(fnFunction, vArgument) {
  fnFunction(vArgument);
}
var doAdd = new Function("iNum", "alert(iNum + 10)");
callAnotherFunc(doAdd, 10); // keluarkan "20"

Dalam contoh di atas, callAnotherFunc() mempunyai dua parameter - fungsi yang dipanggil dan parameter yang dipasang ke fungsi. Kod ini memasukkan doAdd() ke fungsi callAnotherFunc(), parameter adalah 10, keluarkan "20".

Perhatian:Walaupun boleh digunakan constructor Function untuk membuat fungsi, lebih baik jangan gunakannya, kerana mendefinisikan fungsi dengan cara ini lebih lambat daripada cara tradisional. Walau bagaimanapun, semua fungsi dianggap sebagai instansia Klas Function.

Properti length Objek Function

Seperti yang disebutkan sebelumnya, fungsi adalah jenis tipe referensi, jadi mereka juga mempunyai properti dan metod.

Properti length yang didefinisikan oleh ECMAScript menyatakan jumlah parameter yang diharapkan fungsi. Contohnya:

function doAdd(iNum) {
  alert(iNum + 10);
}
function sayHi() {
  alert("Hi");
}
alert(doAdd.length); // keluarkan "1"
alert(sayHi.length); // keluarkan "0"

Fungsi doAdd() mendefinisikan satu parameter, jadi length-nya adalah 1; sayHi() tidak mendefinisikan parameter, jadi length-nya adalah 0.

Ingat, walau berapa banyak parameter yang didefinisikan, ECMAScript boleh menerima banyak parameter (maksimum 25), ini dijelaskan di bab 'Ringkasan Fungsi'. Properti length hanya memberikan cara mudah untuk melihat jumlah parameter yang diharapkan secara baku.

Metod Objek Function

Objek Function juga mempunyai metod valueOf() dan toString() yang berbagi dengan semua objek. Kedua metod ini kembalikan kod fungsi, yang sangat berguna dalam debug. Contohnya:

function doAdd(iNum) {
  alert(iNum + 10);
}
document.write(doAdd.toString());

Kod di atas keluarkan teks fungsi doAdd().Cuba Sendiri