Objek Function ECMAScript (kelas)

Fungsi di ECMAScript sebenarnya adalah objek yang lengkap.

Objek Fungsi (kelas)

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

Kelas Function dapat merepresentasikan setiap fungsi yang didefinisikan pengembang.

Sintaks untuk membuat fungsi langsung dengan 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主体 fungsi (kode yang akan dieksekusi). Parameter ini harus berupa string.

Ingat fungsi di bawah ini?

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

dapat ditentukan seperti ini:

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

Meskipun bentuknya cukup sulit karena hubungan string, ini membantu memahami bahwa fungsi hanya jenis referensi, dan perilakunya sama seperti fungsi yang dibuat dengan Function klasse.

Silakan lihat contoh di bawah ini:

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

Seperti yang diketahui, fungsi kedua menimbulkan ulang fungsi pertama, sehingga doAdd(10) mengeluarkan "20", bukan "30".

Jika kode blok diulang dengan bentuk di bawah, konsep ini akan jelas:

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

Silakan lihat kode ini, dengan jelas bahwa nilai doAdd telah diubah menjadi pointer yang mengarah ke objek yang berbeda. Nama fungsi hanya referensi ke objek fungsi, bertindak seperti objek lainnya. bahkan dapat membuat dua variabel mengarah ke fungsi yang sama:

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

Di sini, variabel doAdd telah ditentukan sebagai fungsi, lalu alsodoAdd diumumkan sebagai pointer yang mengarah ke fungsi yang sama. Kedua variabel ini dapat dieksekusi kode fungsi dan mengeluarkan hasil yang sama - "20". Jadi, apakah fungsi dapat di Passing sebagai parameter ke fungsi lain? Jawabannya adalah ya!

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

In the above example, callAnotherFunc() has two parameters - the function to be called and the parameters passed to the function. This code passes doAdd() to the callAnotherFunc() function, with the parameter 10, and outputs "20".

Note:Although the Function constructor can be used to create functions, it is best not to use it because defining functions with it is much slower than with traditional methods. However, all functions should be considered instances of the Function class.

The length property of the Function Object

As mentioned earlier, functions are reference types, so they also have properties and methods.

The length property defined by ECMAScript declares the number of parameters expected by the function. For example:

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

The doAdd() function defines one parameter, so its length is 1; sayHi() does not define any parameters, so its length is 0.

Remember, regardless of how many parameters are defined, ECMAScript can accept an arbitrary number of parameters (up to 25), which was explained in the 'Overview of Functions' chapter. The length property is just a convenient way to view the expected number of parameters by default.

Methods of the Function Object

The Function object also has the valueOf() method and the toString() method shared with all objects. Both methods return the source code of the function, which is particularly useful during debugging. For example:

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

The code above outputs the text of the doAdd() function.Try It Yourself!