2. Példa kód #1vágjunk a közepébe! // A dokumentum bármely pontjáról elérhető var globalis_valtozo= ‘Action speak’; function A() { // függvényen belüli helyi változó var a_helyi = ‘louder’; function B() { var b_helyi = ‘thanwords’; alert(globalis_valtozo +""+ a_helyi +""+ b_helyi); } // Visszaadjuk referenciaként return B; } // Példa kód futtatása var pelda_kod = A(); pelda_kod();
3. Mi ebben az érdekes? Az „A” függvény már befejezte futását, de a „B” függvény továbbra is hivatkozik az A függvény egyik változójára (futási környezetére). Closure szemléltetése – a külső függvény visszaadja a belső függvényt, ami továbbra is élvezi a külső függvény hatókörét A külső függvény (A) végrehajtási kontextusa a függvény futásának befejezése után sem szűnik, mivel a benne létrehozott belső függvény (B) továbbra is hivatkozik rá. Ezt nevezzük lezárásnak (closure). Ez annyit jelent, hogy egy belső függvényből mindig elérhetők a külső függvény változói, még akkor is, ha a külső függvény már lefutott.
4. Példa kód #2 // Szorzás, példa kód function szorzas(x) { // A kapott értéket összeszorzom a már definiálttal return function(y) { return x * y; }; } // Definiálok pár változót, 2-vel és 5-el való szorzáshoz varszorzas2 = szorzas(2); varszorzas5 = szorzas(5); // Példa kód futtatása alert(szorzas2(5));// 10 alert(szorzas5(5));// 25
5. Mit csináltam? Létrehoztam egy szorzas nevű függvényt, aminek 1 bemeneti paramétere van. A visszatérési értéke egy függvény. Ez a függvény szintén 1 bemeneti paramétert vár. Visszatéréskor a már meglévő 2 paraméter szorzatát adja vissza. A szorzas egy gyártó függvény (FactoryMethod). Az ehhez hasonló függvények feladata létrehozni vagyis „legyártani” egy másik függvényt. Az előző példa alapján kétszer is ezt használtuk, hogy létrehozzuk a 2-vel és 5-tel való szorzó függvényeinket (szorzas2() és szorzas5()). Használata egyszerű: A létrehozott szorzas2()-nek egy tetszőleges szám paramétert kell megadni és máris beszorozza 2-vel.
6. Tudtad-e? és Zárszó. Egymásba ágyazott függvények esetén lezárást használsz. Ilyenkor a belső függvény referencián keresztül hivatkozik a külső függvény változóira. Függvényen belüli eval()használatakor lezárást használsz. Forrás anyagok, bővebb információk a témában magyarul: Szabó Attila - Javascript HardCore http://javascript.w3net.eu/closure.htm Angol nyelven: http://www.jibbering.com/faq/faq_notes/closures.html#clClose https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Working_with_Closures Továbbiérdekespéldakódok: http://blog.morrisjohns.com/javascript_closures_for_dummies.html A prezentációt készítette: Schneidhoffer Dávid Email: david.schneidhoffer@gmail.com