ECMAScript Function objekt (klasse)

ECMAScript 的函数实际上是功能完整的对象。

Function 对象(类)

ECMAScript 最吸引人的可能是函数实际上是功能完整的对象。

Function 类可以表示开发者定义的任何函数。

语法如下,使用 Function 类直接创建函数:

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

I denne form er hver arg er alle en parameter, den sidste parameter er funktionskroppen (den kode, der skal udføres). Disse parametre skal være streng.

Husker du denne funktion?

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

kan også defineres på denne måde:

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

Selvom det kan være lidt svært at skrive på denne måde på grund af strengforholdene, hjælper det med at forstå, at funktioner blot er en reference-type, og deres adfærd er den samme som funktioner, der er skabt ved Function-klassen.

Se dette eksempel nedenfor:

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

Som du ved, overlægger den anden funktion den første funktion, så doAdd(10) outputter "20" i stedet for "30".

Hvis du skriver dette stykke kode på denne måde, bliver konceptet klart:

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

Overvej dette stykke kode, det er klart, at værdien af doAdd er blevet ændret til at pege på en anden objektpejling. Funktionsnavnet er kun en referencemæssig værdi til funktionsobjektet, og adfærden er som andre objekter. Det er endda muligt at lade to variabler pege på samme funktion:

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

Her, variablen doAdd er defineret som en funktion, og derefter er alsodoAdd erklæret som en pejling til den samme funktion. Begge variabler kan udføre funktionskoden og outputte samme resultat - "20". Derfor, hvis funktionsnavnet kun peger på funktionsobjektet, kan funktionen sendes som parameter til en anden funktion? Svaret er ja!

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

I det ovenstående eksempel har callAnotherFunc() to argumenter - den funktion, der skal kaldes, og parameterne, der skal overføres til funktionen. Dette kodeeksempel overfører doAdd() til callAnotherFunc() funktionen, parameteren er 10, og outputtet er "20".

Bemærk:Selvom det er muligt at oprette funktioner med Function-konstruktøren, er det bedre ikke at gøre det, fordi det er meget langsomt sammenlignet med den traditionelle metode. Dog bør alle funktioner betragtes som instanser af Function-klassen.

Function-objektets length-egenskab

Som nævnt tidligere er funktioner reference-typer, så de har også egenskaber og metoder.

ECMAScript-definede egenskaben length erklærer det forventede antal argumenter for funktionen. For eksempel:

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

Funktionen doAdd() definerer et argument, så dens length er 1; sayHi() definerer ingen argumenter, så length er 0.

Bemærk, at ECMAScript kan acceptere en hvilken som helst antal argumenter (op til 25), hvilket er beskrevet i kapitlet 'Funktionsoversigt'. Egenskaben length er kun en bekvemmelighed til at se det forventede antal argumenter i standardtilstand.

Function-objektsmetoder

Function-objektet har også de metoder, der deles med alle objekter, valueOf() og toString(). Begge metoder returnerer koden til funktionen, hvilket er særligt nyttigt under fejlfinding. For eksempel:

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

Denne kodeoutput indeholder teksten for doAdd() funktionen.Prøv det selv!