Programování v jazyce JavaScript
Katedra softwarového inženýrství Fakulta informačních technologií České vysoké učení technické v Praze © Pavel Štěpán, 2011
Funkce podrobněji BI-JSC
Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti
P. Štěpán
PHP
BI-PHP, výpis 5
1/5
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
Funkce detaily
<script type="text/javascript"> // funkce jsou v JavaScriptu objekty - maji vlastnosti a metody // "klasicka" definice funkce function soucet(s1,s2){ return s1 + s2; } // vlastnost length FUNKCE (nikoli arguments) urcuje // pocet DEKLAROVANYCH parametru function soucet(s1,s2){ // test, zda pocet parameru pri volani se rovna deklaraci if (soucet.length != arguments.length){ alert("Moulo! Zadej 2 parametry!!"); return; } return s1 + s2; } // funkce lze volat jako procedura - bez pouziti navratove hodnoty // soucet(1,2,3); // funkci (DEFINOVANOU FUNKCNIM VYRAZEM) nelze volat pred // zpracovanim definice: // alert(soucetVar(2,3)); // chyba // deklarace funkce pomoci funkcniho vyrazu a prirazeni do promenne // (funkce lze prirazovat!!) var soucetVar = function(s1,s2){ // bez jmena funkce!! return s1 + s2; }; // strednik - inicializace promenne // alert(soucetVar(2,3)); // volani pomoci promenne /* Pri definici funkce pomoci funkcniho vyrazu lze funkci volat az PO vykonani funkcniho vyrazu. Pro klasicke defininice kdekoli v provadecim kontextu. Definice funkce pomoci konstruktoru funkce, ktery ma libovolny pocet parametru. Posledni z nich je telo funkce, predchozi jsou jeji parametry. Neni efektivni (dvoji interpretace), ale nazorne: */ var soucet = new Function("s1","s2","return s1 + s2"); // alert(soucet(3,4)); P. Štěpán
PHP
BI-PHP, výpis 5
2/5
// Nazvy funkci jsou pointery na funkce - i pro klasicke definice; // Proto nelze provadet pretezovani - do pointeru priradi ukazatel // na novou definici // Jako u objektu lze mit pro jednu funkci vice pointeru (nazvu): function Dvakrat(m){ return m + m; } var Dbl = Dvakrat; // alert(Dbl(3)); // funkce jsou promenne (pointery) - lze je tedy predavat jako // parametry dalsich funkci, nebo z nich vracet: function volejFunkci(funkce,p1,p2){ return funkce(p1,p2); } function rozdil(p1,p2){ return p1 - p2; } function soucin(p1,p2){ return p1*p2; } // alert(volejFunkci(rozdil,6,2)); // alert(volejFunkci(soucin,6,2)); // funkce lze z funkce i vracet function vytvorFunkci(koef1,koef2){ return function(x){ return koef1*x + koef2; } } var vytvorena1 = vytvorFunkci(2,0); var vytvorena2 = vytvorFunkci(1,1); // alert(vytvorena1(3) + "; " + vytvorena2(3)); // alert(vytvorFunkci(2,0)(3)); // zkraceny zapis // Parametry funkci se v JavaScriptu predavaji VZDY HODNOTOU!! // Plati to i pro pointery / funkce se preda jeho kopie! // Pojmenovane parametry, ktere nebyly pri volani prirazeny // maji automaticky hodnotu undefined // interni objekty funkci this a arguments // this - odkaz na objekt (obor platnosti) ve kterem je dana funkce // provozovana (global popr dalsi funkce) P. Štěpán
PHP
BI-PHP, výpis 5
3/5
window.jmeno = "Franta"; // var jmeno = "Franta";
// globalni objekt v prohlizeci // totez
var clovek = {jmeno: "Eva"};
// definice objektu pomoci literalu
function vypisJmeno(){ alert(this.jmeno); }
// this se nastavi az pri volani funkce!!
// vypisJmeno();
// Franta - jsme v globalnim kontextu
clovek.vypis = vypisJmeno; // prirazenim funkce definuji metodu // clovek.vypis();
// Eva - volam v kontextu objektu clovek
// metody funkci apply a call // volani funkce uvnitr zvoleneho oboru platnosti (nastaveni this) // apply - 1. parametr - obor platnosti, 2. - pole (parametry) // nebo argumentes function suma(p1,p2){ return p1 + p2; } function volej1(n1,n2){ return suma.apply(this, arguments); // pouziti s arguments } function volej2(n1,n2){ return suma.apply(this, [n1,n2]); // parametry jako pole } function volej(n1,n2){ return suma.call(this, n1,n2); // v call parametry jako seznam } // alert(volej1(2,3));
// 5
/* hlavni pouziti apply a call - nastaveni oboru platnosti bez prirazeni funkce jako metody objektu vypisJmeno(); Franta vypisJmeno.call(this); Franta (jsme na urovni global) vypisJmeno.call(window); Franta (jsme na urovni global) vypisJmeno.call(clovek); Eva */
P. Štěpán
PHP
BI-PHP, výpis 5
4/5
// vlastnost callee objektu arguments (odkaz na funkci, ktera // vlastni objekt arguments - na danou funkci). Mozno používat // napr. pri prejmenovani rekurzivni funkce: function faktorial(n){ if (n <= 1) return 1; else // return n*faktorial(n-1);
// pozor - faktorial mohu // prepsat!! Nefunguje pri // prejmenovani funkce!
return n*arguments.callee(n-1);
// zde nevystupuje jmeno // funkce!!
} var fakt = faktorial; faktorial = function(){ return 2; }
// redefinoval jsem faktorial
alert(fakt(4));
P. Štěpán
// 24 - OK - nezavisi na jmenu
PHP
BI-PHP, výpis 5
5/5