ECMAScript-Function-objekti (luokka)

ECMAScriptin funktiot ovat itse asiassa täysin toimivia objekteja.

Function-objekti (luokka)

ECMAScriptin ehkä kiinnostavimmat osat ovat ne, että funktiot ovat itse asiassa täysin toimivia objekteja.

Function-luokka voi edustaa kehittäjän määrittämää mitä tahansa funktiota.

Käytä Function-luokkaa suoraan luodaksesi funktion syntaxia seuraavasti:

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

Yllä olevassa muodossa jokainen arg Ne ovat kaikki yksi parametri, viimeinen parametri on funktiokehys (suoritettava koodi). Näiden parametrien on oltava merkkijonoja.

Muista tämä funktio?

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

Voit myös määritellä sen seuraavasti:

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

Vaikka tätä muotoa kirjoittaa on hieman vaikeampaa, se auttaa ymmärtämään, että funktiot ovat vain viittauslajeja, niiden käyttäytyminen on sama kuin Function-luokalla selkeästi luodut funktiot.

Tarkastele seuraavaa esimerkkiä:

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

Kuten tiedät, toinen funktio ylikirjoittaa ensimmäisen funktion, joten doAdd(10) tulostaa "20", ei "30".

Jos kirjoitat koodin seuraavasti, konsepti on selvämpi:

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

Tarkkaile tätä koodia, on selvää, että doAdd:n arvo on muutettu osoittamaan eri objektia. Funktioiden nimet ovat vain viittauksia funktioihin, niiden käyttäytyminen on kuin muutkin objektit. Voit jopa tehdä niin, että kaksi muuttujaa osoittavat samaa funktiota:

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

Tässä, muuttuja doAdd määritellään funktiona, ja sitten alsodoAdd julistetaan osoittamaan samaa funktiota. Molemmilla muuttujilla voidaan suorittaa funktion koodi ja saada samat tulokset - "20". Siksi, jos funktioiden nimet ovat vain viittauksia funktioihin, voidaanko niitä välittää toiselle funktiolle parametrina? Vastaus on kyllä!

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

Yllä olevassa esimerkissä callAnotherFunc() on kaksi parametria - kutsuttava funktio ja parametrit, jotka välitetään funktiolle. Tämä koodi välittää doAdd() funktion callAnotherFunc() -funktioon parametrina 10 ja tulostaa "20".

Huomioitavaa:Vaikka voit käyttää Function-rakentajaa luodaksesi funktion, ei ole suositeltavaa tehdä niin, koska se on paljon hitaampaa kuin perinteinen tapa. Kaikki funktiot tulisi kuitenkin nähdä Function-luokan instansseina.

Function-objektin length-ominaisuus

Kuten aiemmin mainittiin, funktiot ovat viittauslajeja, joten niillä on myös ominaisuudet ja metodit.

ECMAScript määrittää property length, joka ilmoittaa funktion odotettujen parametrien määrän. Esimerkiksi:

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

Funktio doAdd() määrittää yhden parametrin, joten sen length on 1; sayHi() ei määrittele parametreja, joten length on 0.

Muista, että vaikka on määritelty useita parametreja, ECMAScript voi hyväksyä miltei määräämättömän määrän parametreja (enintään 25), mikä on selitetty "Funktioiden yleiskatsaus"-luvussa. Property length tarjoaa yksinkertaisen tavan tarkistaa oletusarvioitu parametrien määrä.

Function-objektin metodit

Function-objektiilla on myös kaikki objekteilla jaetut valueOf() ja toString() -metodit. Molemmat metodit palauttavat funktion alkuperäisen koodin, mikä on erityisen hyödyllistä virheenkorjauksessa. Esimerkiksi:

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

Yllä oleva koodi tulostaa doAdd()-funktion tekstin.Kokeile itse!