Vissza az előzőleg látogatott oldalra (nem elérhető funkció)Vissza a tananyag kezdőlapjára (P)Ugrás a tananyag előző oldalára (E)Ugrás a tananyag következő oldalára (V)Fogalom megjelenítés (nem elérhető funkció)Fogalmak listája (nem elérhető funkció)Oldal nyomtatása (nem elérhető funkció)Oldaltérkép megtekintése (D)Keresés az oldalon (nem elérhető funkció)Súgó megtekintése (S)

Bevezetés a kliens- és szerveroldali webalkalmazások készítésébe / A JavaScript nyelvi alapjai

Tanulási útmutató

Összefoglalás

Bevezetés a JavaScript nyelvbe, alapvetően korábbi, főleg C-szintaxisú nyelvekből szerzett tapasztalatokra építve. Elsősorban az ezekkel való hasonlóság kerül ebben a fejezetben hangsúlyozásra.

A JavaScript nyelvi alapjai

A kliensoldali webprogramozás nem áll másból, mint hogy megfelelő JavaScript kódot kell elhelyezni a HTML kódban. A „JavaScript” kifejezés azonban több különböző elemet takar. Az egyik maga a nyelv, az, amit az ECMAScript szabvány is definiál. A másik az a programozói interfész, amin keresztül JavaScript kóddal manipulálni lehet a betöltött dokumentum elemeit. Ebben a fejezetben kizárólag az első értelemben vett JavaScripttel, azaz a nyelvi elemekkel foglalkozunk.

A JavaScript nyelv múzsái

A JavaScript nyelv tervezésekor több más nyelv szolgált mintaként. A szintaxist – ahogy azt a JavaScript nyelv történeténél olvastuk – szándékosan a C nyelvcsaládtól örökölte, hogy a Java nyelvvel ebben a tekintetben hasonló legyen. A hasonlóság azonban nagyjából ki is merül ebben. Másik forrás a Scheme nevű, funkcionális programozási nyelv volt, amelytől a JavaScript a funkcionális aspektusát kapta meg (függvények mint első osztályú objektumok). Egy következő minta a Self nyelv volt, mely egy prototípus alapú objektum-orientált nyelv. A Self nyelv a hagyományos objektum-orientált programozási modell hátulütőit próbálta oly módon megoldani, hogy megszüntette az osztályok és objektumok között különbséget, és helyette dinamikus objektumokat vezetett be, amelyek közvetlenül egymást másolják. Azokat az objektumokat pedig, amelyekről a másolatokat készítik, prototípusoknak hívja. A JavaScript nyelv ebből a koncepcióból örökli dinamikus objektumait, és a prototípus alapú, szó szerinti objektum-orientáltságát. Az utolsó ihletet adó alkalmazás a HyperCard volt, ami az első hipermédia rendszernek is tekinthető: szövegek, táblázatok, képek interaktív kezelését tette lehetővé. A JavaScript a rendszerből az eseménykezelés filozófiáját vette át.

A sokféle minta egy olyan nyelvet eredményezett, amely nagyon sokoldalúan használható, és nagyon sokféle programozási mintának ad teret. Ebben a tananyagban azzal a – nem kizárólagos – feltételezéssel élünk, hogy az olvasó jártas valamilyen C alapú, magas szintű programozási nyelvben, mint pl. C++ vagy Java. A JavaScript nyelvet is ebből a szempontból közelítjük meg, azaz kiemeljük a szintaktikailag hasonlóságot, és ehhez képest elemezzük az eltéréseket. Tesszük ezt abban reménykedve, hogy a hasonlóságot felismerve az olvasó nem ijed meg egy új nyelvtől, hanem a meglévő ismereteire alapozva bővítheti a tudását. A JavaScript nyelv többi aspektusát részben érintjük, de nem célunk ebben a tananyagban egy teljesen részletes mélyre ható nyelvi bemutatás. Csupán olyan mértékben mutatjuk be a nyelvet, amennyire az segítségünkre lesz eredeti célunkban: a weboldalak programozásában.

Az alábbi nyelvi bevezető alapvető célja egyrészt az, hogy azt megértve az olvasó képes legyen tetszőleges adatszerkezetet a nyelv elemeivel definiálni (modellalkotás), másrészt az, hogy ezen adatszerkezeteken képes legyen feladatokat megoldani programozási tételek JavaScript nyelven történő implementálásával.

Vissza a tartalomjegyzékhez

Nyelvi jellemzők

Ahogy fentebb említettük a JavaScript tudatosan hasonlít a C++ nyelvhez: szintaxis, vezérlési szerkezetei, operátorai szinte egy az egyben megegyeznek. A két nyelv külső hasonlósága mögött azonban lényeges különbségek vannak. A C++ nyelv egy

A JavaScript ezzel szemben egy

A gyengén típusosság azt jelenti, hogy egy változó típusa a benne tárolt értéktől függ, vagy másképpen megfogalmazva: a típusok az értékekhez tartoznak, nem a változókhoz. Az ilyen nyelveket dinamikusan tipizált nyelveknek is szokták hívni. Ez a gyakorlatban azt jelenti, hogy míg C++-ban minden változó bevezetésénél meg kell mondanunk a típusát, és onnantól kezdve csak az adott típusú adat tárolható benne, addig JavaScriptben csak jeleznünk kell, hogy egy változót szeretnénk létrehozni (a var kulcsszóval, ld. később), és onnantól kezdve bármilyen típusú értéket tárolhatunk benne. A gyengén típusossága rengeteg automatikus típuskonverzióval jár olyan esetekben, amikor különböző típusú adatokkal dolgozunk (pl. összehasonlítás, műveletek, stb.) Ennek megvan a maga előnye, hiszen pl. egy szövegként tárolt számot fel lehet használni mindenféle explicit konverzió nélkül matematikai kifejezésekben, ugyanakkor nem várt eredménnyel is szolgálhat egy automatikus átalakítás.

A JavaScript kódot a böngészőbe épített JavaScript értelmező (interpreter) értelmezi sorról sorra. Az értelmezett nyelvekben nincsen fordítási fázis, nem a lefordított kód fut, hanem az első lehetőségnél az értelmező elkezdi a program végrehajtását. Ennek egyik következménye, hogy JavaScriptben nincsen főprogram. A másik az, hogy a programban lévő hiba akkor derül ki, amikor az értelmező ráfut a hibát tartalmazó sorra. Az értelmezett nyelveknél a forrás maga a program. Érdemes megjegyezni, hogy a modern böngészők az optimalizálás és gyors futás érdekében végeznek valamennyi előfeldolgozást a kódban (sőt futás közben is).

A böngésző a HTML oldalt sorfolytonosan tölti be és jeleníti meg. Ha script blokkal találkozik, akkor az abban lévő JavaScript kódot futtatja. A script blokk értelmezésének befejeztével folytatja a blokk után HTML kód betöltésével. Ha egy script blokkban a JavaScript kód valamilyen oknál fogva nem halad tovább (végtelen ciklus, felugró ablak), akkor az oldal betöltése is megáll.

JavaScriptben hiba esetén a hibás kódot tartalmazó script blokk értelmezése megáll, a böngésző a script blokk utáni HTML rész betöltését, és újabb script blokkok értelmezését végzi el. Az alábbi példában az első script blokkban az első konzolra írás sikerül, azonban a következő sorban ReferenceError-t kapunk, hiszen olyan objektum tulajdonságát szeretnénk beállítani, ami nem is létezik. A szkript futása ebben a script blokkban befejeződik, a második konzolra írás nem történik meg. A böngésző megjeleníti a második paragrafust is, majd folytatja a második script blokk értelmezésével, amelyben a 3-as szám a konzolra íródik.

Forráskód
<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Bevezetés a kliensoldali webalkalmazások készítésébe</title>
    </head>
    <body>
        <p>Paragrafus 1.</p>
        <script type="text/javascript">
            console.log('1. szkript blokk eleje');
            alma.szin = 'piros';
            console.log('1. szkript blokk vége');
        </script>
        <p>Paragrafus 2.</p>
        <script type="text/javascript">
            console.log('2. szkript blokk');
        </script>
        <p>Paragrafus 3.</p>
    </body>
</html>

A konzolon megjelenő eredmény a következő:

A fenti JavaScript kód futásának eredménye a konzolonA fenti JavaScript kód futásának eredménye a konzolon

Szkriptnyelveknek azokat a programozási nyelveket nevezzük, amelyek egy adott alkalmazás vagy működési környezet vezérlését teszik lehetővé. Ilyen például a shell szkript, amely egy operációs rendszer működését vezérli, és a JavaScript is ilyen, hiszen a böngésző és a betöltött dokumentum állapotát változtatja meg.

A JavaScript nyelv néhány további jellemzője:

Vissza a tartalomjegyzékhez

Megjegyzések

Megjegyzéseket ugyanúgy lehet írni JavaScriptben, mint C++-ban. Az egysoros megjegyzést a // után, a többsorost a /* */ közé lehet írni.

Forráskód
//egysoros megjegyzés
 
/*
többsoros
megjegyzés
*/

Vissza a tartalomjegyzékhez

Típusok

JavaScriptben a következő elemi adattípusok vannak:

Ezek mellett még két speciális értéket (egyértékű elemi típust) különböztet meg:

Az összetett típusok:

Vissza a tartalomjegyzékhez

Egyszerű típusok

Az alábbiakban gyakran beszélünk majd egy adott típusú érték literálformájáról. Literálformának nevezzük azt, ahogy az érték megjelenik kifejezésekben (pl. értékadásban).

Logikai értékek

A logikai típusnak két értéke van:

Forráskód
true
false
Megjegyzés

Logikai kifejezésekben (pl. egy elágazás feltételében) bármilyen érték logikai értékké konvertálódik. Hamis értéket adnak az alábbiak:

  • 0
  • false
  • üres sztring (pl. '')
  • NaN
  • undefined
  • null

Minden egyéb érték igazként értékelődik ki.

Számok

A JavaScript nem különbözteti meg az egész számokat a lebegőpontosaktól, a háttérben minden szám 64 bites lebegőpontos számként van tárolva. A gyakorlatban amíg egy szám egészként ábrázolható, egészként jelenik meg, ha a rajta végzett művelet kivezet az egész számok köréből, akkor lebegőpontos számként kerül kiírásra. Az egész számok 32 bites előjeles egészként kezelődnek, ami meghatározza az értéktartományukat. Számliterálok:

Forráskód
12
-12
12.34
-12.34
Megjegyzés

A JavaScript képes oktális és hexadecimális számokat is megjeleníteni. Ezekre példa a hivatalos leírásban található. A lebegőpontos számoknál a tudományos formátum is támogatott.

Szövegek

JavaScriptben a szövegek karakterek sorozata. Nem különbözteti meg a karaktert a szövegtől. Szöveges érték megjelenítéséhez egyaránt használható az idézőjel és a macskaköröm is. Egyik a másikban minden gond nélkül megjelenhet. A szövegliterál támogatja az escape szekvenciákat.

Forráskód
'Szöveg'
"Szöveg"
'Idézőjelben "így" macsakörmölök'
"Macskakörömben 'így' idézek"
'Idézőjelben \' idézőjel'
"Macskakörömben \" macskaköröm"
'Escape: \t \n \\ '

undefined és null

Bár a nyelv megkülönbözteti ezt a két értéket, szerepük nagyjából hasonló: az undefined a nem definiált értéket, a null a szándékos érték nélküliséget jelöli. A JavaScriptben az undefined fordul elő többször: ez az értéke egy kezdőérték nélküli változónak, vagy ezzel tér vissza egy függvény, ha nem adunk explicit visszatérési értéket. Ezzel szemben null értékkel sokkal ritkábban találkozunk. Literálformái:

Forráskód
undefined
null

Vissza a tartalomjegyzékhez

Változók

Változókat a var kulcsszó segítségével hozunk létre. Változó létrehozásakor rögtön adhatunk a változónak kezdőértéket. Ha ezt nem tesszük meg, akkor a változó értéke undefined lesz. Több változót is lehet egyszerre deklarálni, ezeket a , operátorral választjuk el egymástól.

Forráskód
//Változó kezdőértékkel
var nev = 'Micimackó';
 
//Változó kezdőérték nélkül
var masik;  //undefined
 
//Több változó deklarálása egyszerre
var alma = 'piros',
    korte = 'sárga';

Bár a függvényeknél részletesebben tárgyaljuk, de itt is érdemes megemlíteni, hogy függvényen kívül deklarált változó globális lesz, míg függvényen belül létrehozott lokálisként jön létre.

Fontos

Ha elhagyjuk a var kulcsszót, akkor minden esetben globális változó jön létre. Ennek nem várt mellékhatásai lehetnek, éppen ezért minden esetben ajánlott a var kulcsszó használata.

Megjegyzés

A fentiek alapján elképzelhető, hogy véletlen elírással könnyen hozhatunk létre globális változókat. Ennek elkerülésére az ECMAScript 5 bevezette az ún. strict mode-ot, amely hibát ad var kulcsszóval nem deklarált változó használata esetén.

Vissza a tartalomjegyzékhez

Operátorok

Mivel a JavaScript szintaxisát a C nyelvcsaládból örökölte, így az operátorok nagy része is megegyezik azokkal. Rövid felsorolásban tekintsük át az operátorokat:

Ezeken kívül még van pár operátor, amikről részletesen a dokumentációban lehet olvasni.

A fentiek közül a === operátort érdemes kiemelni. Mivel a JavaScript gyengén típusos nyelv, ezért két érték == operátorral történő összehasonlításakor automatikus konverziót végez az értékeken, hogy azonos típusra hozza őket, majd azokat hasonlítja össze. A === operátorral kiküszöbölhető az automatikus konverzió, mert az típus és érték szerinti egyezőséget vizsgál. Az automatikus típuskonverzióból adódó meglepetések elkerülése végett érdemes explicit konvertálás után a === operátort használni. A típus és érték szerinti egyenlőtlenséget a !== operátorral vizsgálhatjuk.

Forráskód
'1' == 1    //true
'1' === 1   //false
'1' !== 1   //true

A másik említésre méltó dolog az operátorokkal kapcsolatban, hogy ugyanúgy a + az összeadás és a szövegösszefűzés operátora. Ha a + operátor bármelyik operandusa szöveg, akkor az operátor szövegösszefűzést végez, azaz az operandusokat szöveggé alakítja, ha valamelyik nem még az.

Forráskód
1 + 1               //2
'piros' + 'alma'    //'piros alma'
'1' + 1             //'11'
'Jézus ' + 12 + ' tanítványa'       //'Jézus 12 tanítványa'
'Jézus ' + 6 + 6 + ' tanítványa'    //'Jézus 66 tanítványa'
'Jézus ' + (6 + 6) + ' tanítványa'  //'Jézus 12 tanítványa'
6 + 6 + ' tanítványa Jézusnak'      //'12 tanítványa Jézusnak', mert balról jobbra értékeli ki a kifejezést

Vissza a tartalomjegyzékhez

Vezérlési szerkezetek

Ha járatosak vagyunk bármilyen C alapú nyelvben, akkor a JavaScript vezérlési szerkezetei is ismerősek lesznek.

Elágazások

Forráskód
//egyirányú elágazás
if (felt) {
  utasítások
}
 
//kétirányú elágazás
if (felt) {
  utasítások
} else {
  utasítások
}
 
//többirányú elágazás, a vizsgálat === operátorral történik
switch(kifejezés) {
  case érték1:
    utasítások
    break;
  case érték2:
    utasítások
    break;
  default:
    utasítások 
}

Ciklusok

A ciklusoknál egyedüli újdonságként a for ... in ciklus jelenik meg, amely egy objektum elemeit sorolja fel (ld. az objektumoknál). A for ciklusnál a deklarált ciklusváltozó nem lesz a ciklusmagra nézve lokális, az egész függvényen belül elérhető.

Forráskód
while (felt) {
  utasítások
}
 
do {
  utasítások
} while (felt);
 
for (var i = 1; i <= n; i++) {
  utasítások
}
 
for (var tul in obj) {
  utasítások
}

Vissza a tartalomjegyzékhez

Összetett típusok

JavaScriptben kétféle összetett típus van: a tömbök és az objektumok.

Tömbök

A JavaScript tömb annyiban hasonlít a C++-ban megismert tömbökre, hogy ez is egy 0-tól kezdve, számokkal indexelt adatszerkezet, ahol az egyes adattagokat a [] operátorral érhetjük el. Ugyanakkor egy nagyon dinamikus típusról van szó abban az értelemben, hogy a tömb hossza tetszőlegesen változtatható, új elemeket lehet beletenni, meglévőket törölni, módosítani, és bármelyik eleme tetszőleges típusú lehet.

Literálformája a [], a szögletes zárójelpárok között lehet megadni a tömb elemeit. A tömb hosszát a length tulajdonságával kérhetjük le.

Nézzünk néhány példát a tömb használatára.

Forráskód
//Üres tömb létrehozása
var uresTomb = [];
 
//Tömb létrehozása előre feltöltött elemekkel
var tomb = [12, 'alma', true];
 
//Hivatkozás a tömb elemeire
tomb[0];    // => 12;
tomb[1];    // => 'alma';
tomb[2];    // => true;
 
//A tömb hosszának lekérdezése
tomb.length // => 3
 
//Elemek módosítás
tomb[0] = 13;
tomb[0];    // => 13
 
//Új elem beszúrása a tömb végére
tomb[tomb.length] = 'uj';   // => tomb[3] === 'uj'
 
//Új elem felvétele tetszőleges indexre
tomb[100] = 'messze';
tomb.length;    // => 101
 
//A köztes elemek undefined értékűek
tomb[99];       // => undefined
 
//Elem törlése (méret nem változik)
delete tomb[1];
tomb[1]; // => undefined
tomb.length; // => 101

Mátrixokat, többdimenziós struktúrákat tömbök tömbjeként lehet létrehozni:

Forráskód
//Mátrix
var m = [[1, 2, 3], [4, 5, 6]];
 
//Vagy sokkal olvashatóbb módon:
var m = [
    [1, 2, 3], 
    [4, 5, 6]
];
 
//Elem elérése:
m[1][2]; // => 6

A tömbök tipikus feldolgozása ciklussal történik. Bár a for ... in ciklus is használható erre, a legbiztonságosabb feldolgozást a klasszikus for ciklus adja.

Forráskód
var gyumolcsok = [
    'alma',
    'korte',
    'szilva'
];
//A gyümölcsök kiírása a konzolra
for (var i = 0; i < gyumolcsok.length; i++) {
    console.log(gyumolcsok[i]);
}

Objektumok

Az objektum JavaScriptben nem más, mint név-érték (vagy kulcs-érték) párok gyűjteménye. Leginkább egy asszociatív tömbhöz hasonlít, amelynek lényege, hogy az egyes elemeket a nevük (vagy kulcsuk) alapján érünk el. Szintaxisában, használatában rekordhoz (C++ struct) vagy az osztálypéldányokhoz hasonlít.

A JavaScript objektumok nagyon rugalmas adatszerkezetek, tetszőleges típust képesek tárolni, és tetszőleges mértékben módosíthatóak, bővíthetőek. Literálformája a , ha előre szeretnénk elemeket megadni benne, akkor azokat kulcs: ertek formában kell felsorolni vesszővel elválasztva. A kulcsot tetszőleges azonosító lehet, bonyolultabb esetekben szövegként kell megadni. Az elemekre vagy a . operátorral hivatkozhatunk, vagy tömbszerűen a [] operátor segítségével.

Nézzünk néhány példát az objektumok használatára:

Forráskód
//Üres objektum létrehozása
var uresObj = ;
 
//Objektum létrehozása előre megadott elemekkel.
var sari = {
  kor: 8,
  'lakhely': 'Budapest',    //a kulcs szöveges megadása nem szükséges, de lehetséges
  'haja szine': 'barna'     //itt viszont kötelező a szöveges megadás
};
 
//Hivatkozás az elemekre
sari.kor;           // => 8
sari['kor'];        // => 8
sari['haja szine']; // => 'barna'
 
//Elem módosítása
sari.kor = 9;
 
//Objektum bővítése
sari.fiu = false;
 
//Elem törlése
delete sari.kor;
sari.kor; // => undefined

Az objektumok tetszőleges elemet tartalmazhatnak, így az egyszerű típusok mellett tömböt, vagy akár másik objektumot is.

Forráskód
//Tömb az objektumban
var zsofi = {
    kor: 7,
    kedvencEtelek: [
        'krumplipüré',
        'rántott hús',
        'tejberizs'
    ]
};
//Elem elérése
zsofi.kedvencEtelek[0]; // => 'rántott hús'
 
//Objektum az objektumban
var david = {
    kor: 4,
    cim: {
        iranyitoszam: '1241',
        varos: 'Budapest',
        utca: 'Holvoltholnemvolt utca',
        hazszam: 63
    }
};
//Elem elérése
david.cim.utca; // => 'Holvoltholnemvolt utca'

Az objektumok feldolgozása a for ... in ciklussal történik.

Forráskód
var matyi = {
    kor: 1.5,
    fiu: true,
    cuki: true
}
//Elemek kilistázása a konzolra
for (var i in matyi) {
    console.log(i, matyi[i]);
}
//Eredmény
// => kor 1.5
// => fiu true
// => cuki true

Adatszerkezetek modellezése

Ha feladatunk egy bonyolultabb adatszerkezet modellezése, akkor valamilyen összetett típust használunk a megoldáshoz. JavaScriptben ilyen esetben vagy a tömbben, vagy az objektumban, vagy a kettő együttes használatában gondolkodhatunk. Nézzünk néhány példát!

Ha adott értékek sorozata, akkor azokat tömbbe vesszük fel. Azt, mint C++-ban statikus tömbbel vagy vector-ral oldanánk meg, JavaScriptben a tömbliterállal végezzük el. Ha például meg kell adnunk a nálunk lévő kütyüket, akkor a következőt tesszük:

Forráskód
var kutyuk = [
    'telefon',
    'fülhallgató',
    'pendrive',
    'e-könyv olvasó'
];

Ha különböző értékeket szeretnénk egységbe foglalni, akkor azt record vagy struct helyett objektummal oldjuk meg. Ilyen lehet például egyetemi adataink nyilvántartása:

Forráskód
var hallgato = {
    nev: 'Mosolygó Napsugár',
    neptun: 'kod123',
    szak: 'Informatika BSc'
};

Ha feladatunk ezeknek a hallgatóknak a tárolása, akkor rekordok tömbje helyett a hallgatói objektumokat kell tömbbe szervezni:

Forráskód
var hallgatok = [
    {
        nev: 'Mosolygó Napsugár',
        neptun: 'kod123',
        szak: 'Informatika BSc'
    },
    {
        nev: 'Kék Ibolya',
        neptun: 'kod456',
        szak: 'Informatika BSc'
    }
];

Ha a hallgatóknál a felvett tárgyakat is fel kell sorolnunk, akkor az egyes hallgatói objektumokat bővíteni kell a tárgyak tömbjével:

Forráskód
var hallgatok = [
    {
        nev: 'Mosolygó Napsugár',
        neptun: 'kod123',
        szak: 'Informatika BSc',
        targyak: [
            'Programozás',
            'Webfejlesztés 2.',
            'Számítógépes alapismeretek'
        ]
    },
    {
        nev: 'Kék Ibolya',
        neptun: 'kod456',
        szak: 'Informatika BSc',
        targyak: [
            'Programozás',
            'Webfejlesztés 2.',
            'Diszkrét matematika',
            'Testnevelés'
        ]
    }
];

JSON

Az adatszerkezetek fenti leírási módjának, amely során JavaScript objektum- és tömbliterállal adjuk meg az adatainkat, külön nevet is adtak, és JavaScript Object Notation vagy röviden JSON néven hivatkoznak rá. A JSON formátum ma már szabványosnak számít, és erősebb formai megkötése van, mint amit a JavaScript ezeknél a literáloknál megenged. Az egyik legfontosabb különbség, hogy az objektumok megadásánál a kulcsokat "" között kell megadni. A weben számos ingyenes szolgáltatás érhető el, amelyek ellenőrzik a JSON leírásunk helyességét vagy újraformázzák azokat.

Vissza a tartalomjegyzékhez

Függvények

JavaScriptben a függvényeknek más a szintaxisa, mint amit az erősen típusos C alapú nyelvekben megszoktunk. Gyengén típusos nyelvről lévén szó, a függvényeknél nem kell megadni sem a paraméterek típusát, sem a visszatérési érték típusát. A függvényeket a function kulcsszóval adjuk meg, az utasításokat utasításblokkba helyezzük, a visszatérési értéket a return utasítás után adjuk meg. A függvény meghívása a függvény nevével történik megadva utána zárójelben a paraméterek aktuális értékét. Híváskor a zárójel akkor is kötelező, ha nincsenek aktuális paraméterek. A paraméterek és a visszatérési érték is tetszőleges elemi vagy összetett érték lehet.

Forráskód
//Függvény általános formája
function fvnev(par1, par2) {
    utasítások;
    return visszatérési érték;
}
 
//Például
function negyzet(x) {
    return x * x;
}
negyzet(3);     // => 9

JavaScriptben az egyszerű típusú értékek érték szerint, az összetett típusú adatok referencia szerint adódnak át. Így egy függvény tipikusan a paraméterein keresztül kapja meg a bemeneti adatokat, és a visszatérési értékén keresztül adja meg a feldolgozás eredményét (ahogy az normálisan elvárható).

Vissza a tartalomjegyzékhez

Változók láthatósága

A függvényen kívül deklarált változók globális változók lesznek. Globális változók bárhonnan elérhetőek. A függvényen belül var kulcsszóval deklarált változók a függvényre nézve lokálisak lesznek. Ha függvényen belül elhagyjuk a var kulcsszót, akkor viszont globális változó jön létre. Mivel a globális változók használata könnyen hibához vezethet, ezért próbáljuk meg számukat minimalizálni.

Vissza a tartalomjegyzékhez

Programozási tételek

Ismerve a JavaScript adat- és vezérlési szerkezeteit, a különböző feladattípusokra adott absztrakt programozási tételek JavaScript nyelven is megvalósíthatóak. A teljesség igénye nélkül nézzünk néhány példát.

Összegzés

Feladat

Adott számoknak a sorozata, adjuk meg az összegüket.

A számok sorozatát tömbben tároljuk, az összegzés logikáját függvénybe szervezzük ki. A függvény bemeneti paramétereként a tömböt kell megadnunk, ez inherensen tartalmazza a hosszát is. Az összegzés eredményét a függvény visszatérési értékként adja meg. Az eredményt a konzolra írjuk.

Forráskód
function osszegzes(tomb) {
    var s = 0;
    for (var i = 0; i < tomb.length; i++) {
        s = s + tomb[i];
    }
    return s;
}
 
var x = [1, 3, -2, 8];
console.log('Az összeg: ' + osszegzes(x));

Lineáris keresés

Feladat

Adott számoknak a sorozata, keressünk benne negatív számot.

A tétel különlegessége, hogy kimenetén két adat is megjelenik: van-e a keresett tulajdonságú elem, és ha igen, akkor melyik indexen található. A megoldást adó függvénynek ezzel a két értékkel kell visszatérni. A return után azonban csak egy értéket adhatunk meg, ezért a kettős eredményt egy összetett adatszerkezetbe foglaljuk. A kétféle összetett típus közül az objektum az, amelyik erre a feladatra alkalmasabb, hiszen két értéket kell egységbe foglalnunk. Így a függvény visszatérési értéke egy objektum lesz, amit literálformában adunk meg.

Forráskód
function kereses(x) {
    var i = 0;
    while (i < x.length && !(x[i] < 0)) {
        i++;
    }
    return {
        vane: i < x.length,
        sorsz: i
    };
}
 
var tomb = [1, 3, -2, 8];
console.log(kereses(tomb)); 

Vissza a tartalomjegyzékhez

Beolvasás, kiírás

A JavaScript nyelv önmagában nem tartalmaz beolvasó és kiíró utasításokat. Ezeket mindig az a környezet biztosítja, amiben a JavaScript értelmezésre kerül. Beolvasásra, kiírásra JavaScriptben három lehetőségünk van:

A böngésző beolvasó-kiíró függvényei

A böngészők három beépített függvényt biztosítanak a felhasználóval való kapcsolattartásra.

Az alert() függvény egy felugró ablakban írja ki a paraméterként megkapott értéket. Viszonylag ritkán használjuk. Próbáljuk ki a konzolban a következő kódrészletet:

Forráskód
alert('Hello világ!');

A confirm() függvény egy olyan ablakot dob fel, amelyen egy „OK” és „Mégsem” gomb helyezkedik el a paraméterként megadott szöveg alatt. A függvény igaz értékkel tér vissza az előbbi, hamis értékkel az utóbbi megnyomása esetén. Gyakran használjuk azokban az esetekben, amikor egy művelet megerősítésre vár.

Forráskód
var mehet = confirm('Szereted a csokit?');
console.log(mehet);

A prompt() függvény egy szöveges beviteli mezőt tartalmazó ablakot jelenít meg. Első paramétere az ablakon megjelenő szöveg, az opcionális második pedig a beviteli mező alapértelmezett értékét adja meg. A függvény a beviteli mezőbe írt szöveggel tér vissza. Nagyon ritkán használjuk.

Forráskód
var nev = prompt('Mi a neved?', 'Senki bácsi');
console.log(nev);

A konzol lehetőségei

A JavaScript konzolokra csak kiírni lehet. Kiíró utasításból többet is tartalmazhat egy konzol attól függően, hogy milyen típusú üzenetet írunk ki, szeretnénk-e a kiírásokat csoportosítani, vagy időt mérni. Ezek az utasítások konzolonként változhatnak. A console.log() parancs azonban mindenhol elérhető. Felhasználóval történő kommunikációra nem használjuk, csak fejlesztéskor.

Kommunikáció a dokumentumon keresztül

Mivel a felhasználó a böngészőbe weboldalakat tölt be, ezért az egyértelműen legfelhasználóbarátabb kommunikáció a betöltött dokumentumon keresztül zajlik. Beolvasásra a HTML űrlapelemei szolgálnak, kiírásra pedig a dokumentum adott elemei tartalmának módosítása. Ennek módját akkor részletezzük, amikor a JavaScript és a dokumentum kapcsolatát nézzük meg.

Van egy másik, manapság viszonylag elavultnak mondható lehetőség, amely csak és kizárólag az oldal betöltése közben használható. A document.write() vagy document.writeln() paranccsal JavaScriptből generálhatunk HTML tartalmat az oldalba. Ez a megoldás csupán kiírásra szolgál, de amíg nem ismerjük az egyéb módokat, használhatjuk ezt is feladataink eredményének megjelenítésére.

Forráskód
document.writeln('Tetszőleges HTML');
document.writeln('<p>Példa paragrafus</p>');

Az alábbi példa HTML környezetben mutatja be a használatát.

Forráskód
<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>document.writeln() példa</title>
    </head>
    <body>
        <h1>Celsiusból Fahrenheit</h1>
        <script type="text/javascript">
            var cels = prompt('Celsius fok:', 0)
            var fahr = cels * 9 / 5 + 32;
            document.writeln('<p>Celsius = ' + cels + '</p>');
            document.writeln('<p>Fahrenheit = ' + fahr + '</p>');
        </script>
    </body>
</html>

Vissza a tartalomjegyzékhez

A fejezet összefoglalása

Ebben a részben áttekintettük a JavaScript nyelv alapjait. Láthattuk, hogy szintaktikáját – vezérlési szerkezeteit, operátorait – illetően sok hasonlóság van a C++ vagy a Java nyelvvel, így a programok kinézete nem lehet idegen annak, aki e nyelveket már ismeri. A nyelv jellege azonban eltér ezekétől: egy gyengén típusos, értelmezett nyelvről van szó. Láthattuk azt is, hogy viszonylag kevés típus van a JavaScriptben. Egyszerű típus a szöveg, a szám és a logikai, összetett típusként a tömböt és az objektumot különbözteti. Ez utóbbi kettőből tudjuk felépíteni bonyolultabb adatszerkezeteinket.

Vissza a tartalomjegyzékhez

Feladatok

Oldd meg az alábbi feladatokat JavaScript segítségével.

A feladatok megoldását külön függvényként készítsd el, ahol a bemeneti adatokat paraméterként, a kimenetieket visszatérési értékként szerepelnek.

A feladatok először úgy oldd meg, hogy a bemeneti adatokat adottnak tekintjük (beégetve a forráskódba, mint a fenti példáknál), a kiírást pedig első körben a konzolra kell elvégezni a console.log() parancs segítségével. Opcionálisan egészítsd ki a feladatok megoldását beolvasással és a dokumentumba kiírással a document.writeln() parancs segítségével.

Feladat
  • Írd ki a konzolra 10-szer, hogy „Hello világ!”
  • Kérd be a felhasználó nevét, és üdvözöld „Hello név!” alakban! Kiírásra használhatod az alert() vagy a document.writeln() függvényt is!
  • Készítsd el a Fahrenheitből Celsius fokba átalakító programot! Kérd be a felhasználótól a Fahrenheit értéket és írd ki az oldalra az eredményt!
  • Készíts egy százalékszámító programot! Kérd be a számot, majd azt is, hogy hány százalékára vagy kíváncsi. Az eredményt írd ki!
  • Olvass be három számot, és döntsd el, hogy alkothatják-e egy háromszög oldalát!
  • Adott két egész szám, a és b. Írj függvény, amely eldönti, hogy b osztója-e a-nak!
  • Adott egy pont a síkon. Írj függvényt, amely megmondja, hogy a pont melyik síknegyedbe esik!
  • Adott két szám. Írj függvényt, amely visszaadja legnagyobb közös osztójukat!
  • Adott két szám. Írj függvényt, amely visszaadja legkisebb közös többszörösüket!
  • Írj függvényt, ami visszaadja egy egész szám faktoriálisát!
  • Adott a és b egész szám. Osztás művelete nélkül add meg a-nak b-vel való osztásakor keletkező maradékot.
  • Egy űrlap adatainak ellenőrzése során számos hiba lehet. Készítsd el azt az adatszerkezetet, amelyekben a hibákat tárolod, és töltsd fel példaadatokkal. Listázd ki a hibákat a konzolra!
  • Készíts egy olyan adatszerkezetet, amely egy könyv adatait írja le. A könyvnél a következő adatokat tároljuk:
    • szerző
    • cím
    • kiadás éve
    • kiadó
    • ISBN szám
  • Készítsd el egy bevásárlólistának megfelelő adatszerkezetet, akkor ha a bevásárlólista
    • csak a termékek nevét tartalmazza;
    • a termékek neve mellett a vásárolandó mennyiséget is tárolja.
  • A fenti példában elkészült listákat írasd ki a konzolra!
  • Készítsd el egy raktárnyilvántartás modelljét! A nyilvántartásban az alábbi adatokat tároljuk egy termékről:
    • a termék neve
    • gyártó
    • cikkszám
    • egységár
    • darabszám
  • Vegyél fel néhány példát az adatszerkezetbe, és oldd meg a következő feladatokat. Minden feladatot külön függvény végezzen, amely paraméterként kapja meg az aktuális raktárnyilvántartást.
    • Listázd ki a konzolra a termékek nevét!
    • Állíts elő egy olyan szöveget, amely a termékek nevét HTML felsorolásként adja meg!
    • Állíts elő egy olyan szöveget, amely a raktárnyilvántartást táblázatos formában jelenítené meg, ha az egy HTML oldalon lenne!
    • Add meg, hogy mekkora érték van összesen raktáron!
    • Keress meg egy adott cikkszámú terméket, és ha megvan, akkor add vissza!
    • Add meg, melyik termékből van a legkevesebb raktáron!
    • Add meg egy adott gyártó termékeit!
    • Számold meg, hány különböző gyártó terméke van a raktárban!
  • Írj függvényt, amely megadja egy egész szám prímtényezős felbontását!
  • Írj egy olyan függvényt, amely paraméterül megkap egy objektumot, és megnézi, hogy az adott objektumnak van-e id nevű mezője. Ha nincsen, akkor kiegészíti az objektumot ezzel, és visszaadja a hívó programnak.
  • Készítsd el egy angol-magyar szótár adatszerkezetét és töltsd fel példaadatokkal! Írj függényt, amely egy magyar szónak megadja az angol megfelelőjét! Írd meg a másik irányú fordítást elvégző függvényt is!
  • Filmekről szeretnénk adatokat tárolni:
    • film címét,
    • film hosszát,
    • film kategóriáit (akár több kategóriába is tartozhat egy film),
    • gyártási évét,
    • rendezőit (mert lehet, hogy többen vannak),
    • szereplőit olyan formában, hogy melyik szerepet ki játszotta.
  • Készítsd el a megfelelő adatszerkezetet, és töltsd fel néhány példaadattal! Oldd meg a következő feladatokat külön függvényként!
    • Listázd ki a nyilvántartásban lévő filmeket!
    • Add meg azokat a filmeket, amelyeknek több rendezője is van!
    • Add meg a nyilvántartásban szereplő leghosszabb film címét!
    • Add meg azokat a filmeket, amelyekben egy paraméterként megkapott színész játszik!
  • Egy adott időszakban minden nap megmértük a Balaton vizének hőmérsékletét, és egy sorozatban tároltuk el. Külön-külön függvénnyel oldd meg a következő feladatokat!
    • Mennyi volt a vizsgált időszakban a víz átlaghőmérséklete?
    • Hányszor mértünk 26 Celsius fok feletti hőmérsékletet?
    • Melyik volt a legnagyobb mért hőmérséklet-érték?
    • Hányadik napon volt a leghidegebb a víz?
    • Melyik nap volt a víz pontosan 23 fokos?
    • Előfordult, hogy két egymást követő nap a víz hőmérséklete 3 fokot is változott?
    • Hány napból állt az a leghosszabb időszak, amikor a víz 25 fok felett volt?

Vissza a tartalomjegyzékhez

Új Széchenyi terv
A projekt az Európai Unió támogatásával, az Európai Szociális Alap társfinanszirozásával valósul meg.

A tananyag az ELTE - PPKE informatika tananyagfejlesztési projekt (TÁMOP-4.1.2.A/1-11/1-2011-0052) keretében valósult meg.
A tananyag elkészítéséhez az ELTESCORM keretrendszert használtuk.