ECMAScript-Function-objekti (luokka)
- Edellinen sivu arguments-objekti
- Seuraava sivu Suljetut (closure)
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!
- Edellinen sivu arguments-objekti
- Seuraava sivu Suljetut (closure)