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
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> <meta http-equiv="content-type" content="text/html; charset=utf-8"> </head> <body> <h1>funkce detaily</h1> <script type="text/javascript"> // funkce jsou v JavaScriptu objekty - maji vlastnosti a metody // "klasicka" definice funkce function soucet(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; // 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!! ; // 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"; // globalni objekt v prohlizeci // var jmeno = "Franta"; // 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; alert(fakt(4)); </script> </body> </html> // redefinoval jsem faktorial // 24 - OK - nezavisi na jmenu P. Štěpán PHP BI-PHP, výpis 5 5/5