ECMAScript Function Object (Klasse)

ECMAScript-functies zijn in feite volledige objecten.

Function object (klasse)

Wat ECMAScript het meest interessant maakt, is misschien wel dat functies in feite volledige objecten zijn.

De Function-klasse kan elke door de ontwikkelaar gedefinieerde functie representeren.

De syntaxis om een functie direct met de Function-klasse te maken, is als volgt:

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

in de bovenstaande vorm, elke arg het zijn allemaal parameters, de laatste parameter is de functiebody (het uit te voeren code). Deze parameters moeten strings zijn.

Onthoud deze functie?

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

het kan ook zo worden gedefinieerd:

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

Hoewel dit formaat vanwege de strings enigszins moeilijk te schrijven is, helpt het om te begrijpen dat functies gewoon een referentietype zijn en dat hun gedrag hetzelfde is als dat van functies die expliciet met de Function-klasse worden gecreëerd.

Zie hier een voorbeeld:

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

Zoals je weet, overlaadt de tweede functie de eerste functie, zodat doAdd(10) "20" uitvoert in plaats van "30".

Als je dit stuk code op deze manier herschrijft, wordt het concept duidelijker:

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

Kijk naar dit stuk code, het is duidelijk dat de waarde van doAdd is veranderd in een pointer naar een ander object. Een functienaam is gewoon een verwijzing naar de functieobject en gedraagt zich zoals andere objecten. Het is zelfs mogelijk om twee variabelen naar dezelfde functie te wijzen:

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

Hier, de variabele doAdd is gedefinieerd als een functie, en vervolgens wordt alsdoAdd gedeclareerd als een pointer naar dezelfde functie. Met beide variabelen kan de functiecode worden uitgevoerd en hetzelfde resultaat worden gegenereerd - "20". Dus als de functienaam alleen een verwijzing is naar de functie, kan de functie dan aan een andere functie worden doorgegeven? Het antwoord is ja!

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

In het bovenstaande voorbeeld heeft callAnotherFunc() twee parameters - de functie die moet worden aangeroepen en de parameters die aan deze functie worden doorgegeven. Dit stuk code geeft doAdd() door aan de functie callAnotherFunc(), parameter is 10, en de uitvoer is "20".

Opmerking:Hoewel je de Function constructor kan gebruiken om functies te maken, is het beter dit niet te doen, omdat het definiëren van functies met deze constructor veel trager is dan met traditionele methoden. Toch moeten alle functies worden gezien als instanties van de Function klasse.

De length property van het Function object

Zoals eerder vermeld, behoren functies tot de referentietypen, dus ze hebben ook properties en methods.

De property length die door ECMAScript wordt gedefinieerd, verklaart het aantal verwachte parameters van de functie. Bijvoorbeeld:

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

De functie doAdd() definieert één parameter, dus zijn length is 1; sayHi() definieert geen parameters, dus is de length 0.

Onthoud, ongeacht het aantal parameters dat is gedefinieerd, kan ECMAScript een oneindig groot aantal parameters aanvaarden (maximaal 25), wat is uitgelegd in het hoofdstuk 'Overzicht van functies'. De property length biedt een eenvoudige manier om het aantal verwachte parameters te bekijken.

Methods van het Function object

De Function object heeft ook de methods valueOf() en toString() die gedeeld worden met alle objecten. Deze methods retourneren de broncode van de functie, wat vooral nuttig is bij debuggen. Bijvoorbeeld:

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

Het volgende stuk code geeft de tekst van de doAdd() functie weer.Probeer het zelf!