Függvények¶
Függvénydefiníció¶
JavaScriptben a function
kulcsszóval definiálhatunk saját függvényeket. Ezt követően megadjuk a függvény nevét, majd zárójelek között a bementi paramétereket (ha vannak). A függvény törzsét kapcsos zárójelpár között adhatjuk meg. A függvényeinknek természetesen lehet visszatérési értéke is, ezt a return
kulcsszó után adhatjuk meg.
A függvénydefiníció általános szintaxisa (a szögletes zárójelek közötti részek elhagyhatók):
1 2 3 4 |
|
Bemeneti adatok ellenőrzése¶
Mivel a JavaScript dinamikusan típusos nyelv, így az egyes függvények meghívásakor nem tudhatjuk, hogy milyen típusú paramétereket kapunk. Egy statikusan típusos nyelvnél ez nem gond, de a JavaScript esetében, ha biztosra akarunk menni, érdemes ellenőrizni az egyes függvényparamétereket.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Változók hatásköre (Scope) függvényekben¶
Fontos megérteni, hogyan viselkednek a változók a függvényeken belül:
let
ésconst
: Blokk szintű hatáskörrel rendelkeznek (block scope)var
: Függvény szintű hatáskörrel rendelkezik (function scope)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Függvényhívás és hoisting¶
Ha egy függvényt meg szeretnénk hívni JavaScriptben, akkor azt a szokásos szintaxissal tehetjük meg:
1 |
|
Fontos különbség: A hagyományos function
kulcsszóval definiált függvények esetén hoisting történik ("felemelés/felhúzás"), ami azt jelenti, hogy a definíciójuk előtt is meghívhatók:
1 2 3 4 5 6 |
|
A hívás során átadjuk a függvénynek a bemeneti paramétereket (feltéve ha a kérdéses függvény vár paramétert).
Ha a függvényhívás során nem adjuk meg valamelyik függvényparaméter értékét, akkor az adott paraméter az undefined
speciális értéket veszi fel.
1 2 3 4 5 |
|
Kimenet
John is undefined years old.
Érdekes módon, ha több paraméterrel hívunk meg egy függvényt, mint amennyi paramétert vár, akkor a JavaScript erre nem dob hibát. Ekkor a "felesleges" paraméterek nemes egyszerűséggel figyelmen kívül lesznek hagyva.
1 2 3 4 5 |
|
Kimenet
30
Paraméterek meglétének ellenőrzése¶
Amint fentebb láthattuk, JavaScriptben gond nélkül megtehetjük azt, hogy a függvény egy adott paraméterének nem adunk át értéket a függvényhíváskor. Ezt több módon is ellenőrizhetjük:
Alapvető ellenőrzés¶
1 2 3 4 5 6 7 8 9 10 |
|
Kimenet
Please provide a name to greet!
Hello John!
Általánosabb megoldás¶
A hagyományos ellenőrzés mellett lehetőségünk van egy másik ellenőrzési módszert is használni.
Az arguments egy speciális, tömb-szerű objektum, amely minden hagyományos JavaScript függvényben automatikusan elérhető.
Ez az objektum tartalmazza az összes argumentumot, amelyet a függvény hívásakor átadtak neki, függetlenül attól, hogy a függvény definíciójában hány paramétert deklaráltunk.
Bár tömb-szerű viselkedést mutat (van length
tulajdonsága és számozott indexekkel férhetünk hozzá az elemeihez), valójában nem egy igazi tömb, ezért nem rendelkezik a tömbök összes metódusával.
Az arguments objektumot azért vezették be a JavaScript korai verzióiban, mert lehetővé tette a változó számú paraméterrel rendelkező függvények írását, amikor még nem léteztek a modern megoldások, mint a rest paraméterek (később).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
Default paraméterek¶
JavaScriptben nincs function overload (még eltérő paraméterezés esetén sem). Ha két vagy több azonos nevű függvényünk van, akkor mindig a kódban legkésőbb definiált függvény lesz hívható.
1 2 3 4 5 6 7 8 9 10 |
|
Kimenet
Hello undefined!
Hello John!
A kódban két hello
névre hallgató függvényünk is van, ezért a fentebb leírtak alapján a legutoljára definiált, egy paramétert váró hello(name)
függvény lesz hívható.
Szerencsére a default függvényparáméterek JavaScriptben is léteznek. Ezek segítségével már el tudjuk érni, hogy egy függvényt többféle eltérő paraméterezés mellett is használhassunk.
1 2 3 4 5 6 |
|
Kimenet
Hello World!
Hello John!
Mivel a függvényhíváskor a paraméterek átadása JavaScriptben is "balról jobbra" történik, ezért a default értékkel rendelkező paraméterek mindig a paraméterlista jobb oldalán szerepeljenek.
1 2 3 4 5 6 7 8 9 10 |
|
Kimenet
John is 25 years old and works as a developer.
John is 30 years old and works as a developer.
John is 30 years old and works as a designer.
John is 25 years old and works as a teacher.
Rest paraméterek (Modern JavaScript)¶
A modern JavaScriptben használhatjuk a rest operátort (...
) is, amely lehetővé teszi változó számú paraméter kezelését.
Ebben az esetben a paraméter egy bejárható tömb lesz.
Ennek használatáról később lesz szó.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Callback függvények¶
JavaScriptben gyakran előfordul, hogy egy függvényt egy másik függvény paramétereként használunk fel. Az ilyen függvényt nevezzük callback függvénynek.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Kimenet
Let the music play!
Biztonságos callback kezelés¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Kimenet
Callback function called with parameter: kitten
Provided callback is not a function!
JavaScript függvények egyéb megadási módjai¶
Anonim függvények (Function Expressions)¶
JavaScriptben a hagyományos függvénydefiniálás mellett a függvényeket egy kifejezésként is definiálhatjuk.
1 2 3 4 5 6 |
|
Kimenet
15
Fontos különbség a hoisting-ban:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Arrow function-ök (ES6+)¶
Az ECMAScript 6 (ES6) szabványban bevezették az arrow function-öket az anonim függvények tömörebb megadására.
1 |
|
Példa: Különböző paraméter számú arrow function-ök
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Kimenet
Hello World!
Our favorite ice cream flavor: chocolate
15
12
Haladó függvény technikák¶
Immediately Invoked Function Expression (IIFE)¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Higher-order függvények¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|