WEBES ALKALMAZÁSFEJLESZTÉS 1.

Hasonló dokumentumok
Osztályok. 4. gyakorlat

WEBES ALKALMAZÁSFEJLESZTÉS 1.

Web-technológia PHP-vel

SZERVER OLDALI JAVASCRIPT. 3. hét Javascript nyelvi elemek

WEBES ALKALMAZÁSFEJLESZTÉS 1.

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

Globális operátor overloading

Java és web programozás

A JavaScript főbb tulajdonságai

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 11. Széchenyi István Egyetem, Gy r

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

C++ referencia. Izsó Tamás február 17. A C++ nyelvben nagyon sok félreértés van a referenciával kapcsolatban. A Legyakoribb hibák:

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

OOP #14 (referencia-elv)

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Programozás módszertan

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

JAVA PROGRAMOZÁS 2.ELŐADÁS

Bevezetés a programozásba Előadás: A const

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Apple Swift kurzus 3. gyakorlat

Java II. I A Java programozási nyelv alapelemei

Programozás II. 4. Dr. Iványi Péter

Bevezetés a Python programozási nyelvbe

Programozási nyelvek Java

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

Smalltalk 3. Osztályok létrehozása. Készítette: Szabó Éva

Java programozási nyelv 4. rész Osztályok II.

Java III. I I. Osztálydefiníció (Bevezetés)

Már megismert fogalmak áttekintése

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

OOP: Java 8.Gy: Abstract osztályok, interfészek

Programozási nyelvek Java

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Függvények. Dr. Bécsi Tamás 6. Előadás

8. gyakorlat Pointerek, dinamikus memóriakezelés

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

és az instanceof operátor

Java II. I A Java programozási nyelv alapelemei

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

Objektumorientált Programozás VI.

Java III. I I. Osztálydefiníció (Bevezetés)

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

WEBES ALKALMAZÁSFEJLESZTÉS 1.

Bevezetés a Programozásba II 2. előadás. Adattípusok megvalósítása egységbe zárással. Adattípusok megvalósítása egységbe zárással

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Objektumok inicializálása

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 2.ELŐADÁS. Objektumorientált programozás

Pénzügyi algoritmusok

C++ programozási nyelv

Öröklés és Polimorfizmus

Programozási nyelvek Java

A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.

ELTE SAP Excellence Center Oktatóanyag 1

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

Programozási nyelvek Java

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

Python tanfolyam Python bevezető I. rész

Pénzügyi algoritmusok

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

A C programozási nyelv III. Pointerek és tömbök.

Gregorics Tibor Modularizált programok C++ nyelvi elemei 1

Java programozási nyelv 5. rész Osztályok III.

Java és web programozás

3. Osztályok II. Programozás II

Eseménykezelés. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor.

Java és web programozás

Alapok. tisztán funkcionális nyelv, minden függvény (a konstansok is) nincsenek hagyományos változók, az első értékadás után nem módosíthatók

A függvények névvel rendelkező utasításcsoportok, melyeknek információkat adhatunk át, és van egy visszatérési értékük.

A C programozási nyelv III. Pointerek és tömbök.

Programozás alapjai. 7. előadás

Programozás II. 2. Dr. Iványi Péter

C# osztálydeníció. Krizsán Zoltán 1. .net C# technológiák tananyag objektum orientált programozás tananyag

Programozás C és C++ -ban

Bevezetés a programozásba. 9. Előadás: Rekordok

Rekurzió. Dr. Iványi Péter

Programozási nyelvek II.: JAVA

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Informatika terméktervezőknek

1. Alapok. Programozás II

Programozás I. 5. Előadás: Függvények

C++ programozási nyelv Konstruktorok-destruktorok

Bevezetés a programozásba. 8. Előadás: Függvények 2.

Programozási nyelvek Java

OOP alapok Egy OOP nyelvet három fontos dolog jellemez. egységbezárás ( encapsulation objektumoknak öröklés ( inheritance

OOP. Alapelvek Elek Tibor

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

.Net adatstruktúrák. Készítette: Major Péter

Programozási nyelvek a közoktatásban alapfogalmak II. előadás

Átírás:

WEBES ALKALMAZÁSFEJLESZTÉS 1. Horváth Győző Egyetemi adjunktus 1117 Budapest, Pázmány Péter sétány 1/C, 2.420 Tel: (1) 372-2500/1816

2 Függvény JavaScriptben

Függvények 3 Olyan objektum, ami meghívható kódot tartalmaz Általános tudnivalók visszatérési értékkel rendelkezik return kulcsszó undefined Tetszőleges számú paraméter First class object Futási időben létrehozható Objektumok, saját metódussal és tulajdonságokkal Változóban tárolható Paraméterként átadható Visszatérési értékként megadható

4 Függvény létrehozása

Függvénydeklaráció 5 Kötelező név Egész futási kontextusban elérhető function multiply(a, b) { return a * b; // Valójában már itt elérhetõ a gethero függvény var hero = gethero(); assertequals('superman', hero); function gethero() { return 'Superman';

Függvénykifejezés 6 Függvény mint kifejezés (függvényliterál): function [name]([param] [, param] [..., param]) { statements Névtelen függvénykifejezés: //Névtelen függvénykifejezés átadása egy változónak var multiply = function(a, b) { return a * b; ; Nevesített függvénykifejezés: //Névtelen függvénykifejezés átadása egy változónak var multiply = function multiply(a, b) { return a * b; ;

Fat arrow szintaxis (ES6) 7 var heroes = [ 'Superman', 'Spiderman', 'Sugarman' ]; //Általános forma ([param[, param[,... param]]]) => { statements //Egyszerűbb eset param => expression // Ha össze szeretnénk számolni a hősök neveinek hosszát, akkor legegyszerűbb a map függvényt használni: heroes.map(function(hero) { return hero.length; ); // A Fat arrow operátorral lényegesen expresszívebb kódot kapunk: heroes.map( hero => hero.length );

Function objektum 8 Függvénytörzs szövegként Dinamikusan generált függvények Speciális esetekben használandó Egyébként kerüljük! var multiply = new Function('a, b', 'return a * b');

Deklaráció vs kifejezés 9 a(); //b(); //nem működik function a() { console.log('a'); var b = function () { console.log('b'); ; b(); var c = function c() { console.log('c'); ; c(); var d1 = function d2() { console.log('d'); ; d1(); //d2(); //nem működik, csak belül érhető el

10 Változók a függvényekben

Lokális változók 11 var kulcsszó Változókat bárhol deklarálhatunk a függvényen belül A függvénytörzs első műveleteként jönnek létre, és értékük undefined. Érdemes a legelején létrehozni (JSLint)

Lokális változók viselkedése 12 var valtozovizsgalat = function() { console.log(valtozo); var valtozo = 5; // => undefined, ha nem hoznánk létre a következő sorban, akkor itt most referenceerror lenne // Innen már 5 a valtozo értéke valtozovizsgalat(); // A fenti függvény valójában ezzel ekvivalens: var valtozovizsgalat = function() { var valtozo; console.log(valtozo); valtozo = 5; // => undefined

Hatókör 13 Minden változó hatóköre az a függvény, ahol őt létrehozzuk Erre a függvényre nézve lokális változó lesz A függvényen belül definiált újabb függvényeken belül el tudjuk érni. Belső függvényben definiált ugyanolyan nevű változó elfedi a külső függvénybeli változót Belső függvényből módosítható külső függvénybeli változó. Vigyázzunk vele!

Hatókör 14 var outerfunction = function() { var a = 1, b = 2, c = 3, innerfunction = function(b) { var c = 4, d = 5; a = 2; // Ezen a ponton a globális "b" és "c" változó // el van fedve, így "b" undefined, a "c" lokális // változó értéke pedig 4. A "d" egy új lokális // változó, a függvényen kívül nincs definiálva // Ezen a ponton a,b,c értéke a scope-nak // megfelelõen 1,2,3 és d változó nem létezik innerfunction(); // A függvény lefutása után az "a" értéke módosul // 2-re, hiszen az innerfunction nem fedi el, // sõt megváltoztatja azt! ;

ES6 let 15 //Function scope function funcexample() { for (var i = 0; i<3; i++) { console.log(i); assertequals(i, 3); funcexample(); //Block scope function blockexample() { for (let i = 0; i<3; i++) { console.log(i); assertequals(i, undefined); blockexample();

Változók élettartama 16 Függvényekben létrehozott változók élettartama addig tart, amíg azok használatba vehetőek (mutat rájuk referencia) Alapesetben a függvény futási ideje Garbage collector Szükséges lexikális scope-pal rendelkező nyelvek esetén (ld. closure)

17 Függvényparaméterek

Paraméterek száma 18 Aktuális paramétereinek száma eltérhet a formálisakétól Ha kevesebb aktuális van, akkor a maradék formális undefined Ha több aktuális van, akkor is elérhető (arguments, rest parameters)

Paraméterek száma 19 var parproba = function (a, b) { console.log('a = ', a); console.log('b = ', b); console.log('arguments = ', arguments); parproba(1, 2); // a = 1 // b = 2 // arguments = [1, 2] parproba(1); // a = 1 // b = undefined // arguments = [1] parproba(1, 2, 3); // a = 1 // b = 2 // arguments = [1, 2, 3]

Paraméterlista dinamikus kezelése 20 Minden függvény rendelkezik egy arguments nevű tömbszerű objektummal Változó paraméterszám kezelésére szolgál Nem tömb, csak tömbszerű length tulajdonság Nincsenek tömbmetódusok EcmaScript 5 tömbszerűbbé teszi arguments objektum módosításával a paraméterek értékei is változnak oda-vissza igaz (ES3)

arguments példa 21 var osszegzo = function() { var osszeg = 0; for (var i = 0, l = arguments.length; i < l; i += 1) { osszeg += parseint(arguments[i], 10); return osszeg; osszegzo(1,2); // => 3 osszegzo(2,3,4); // => 9

arguments tömbösítése 22 Külön függvénnyel Tömbfüggvény kölcsönvételével var args = Array.prototype.slice.call(arguments, 0); //vagy var args = [].slice.call(arguments, 0);

ES6 paraméterkezelés 23 Alapértelmezett értékek (tetszőleges kifejezés): function defpars(a, b = 42) { return [a, b]; assertequals( [1, 2], defpars(1, 2) ); assertequals( [1, 42], defpars(1) ); assertequals( [undefined, 42], defpars() ); Változó hosszúságú paraméterlisták: function restpars(a,...others) { return others; assertequals( [2, 3], defpars(1, 2, 3) ); assertequals( [], defpars(1) ); assertequals( [], defpars() );

Konfigurációs objektum 24 Függvénynek objektumliterál átadása Függvénytörzsben ellenőrizni var jsablak = function (opts) { if (!opts) opts = {; // ha nem adunk meg opts paramétert, legyen üres objektum opts = { // alapértékek megadása szelesseg: opts.szelesseg 500, magassag: opts.magassag 300, cim: opts.cim 'Névtelen ablak' //... jsablak({ szelesseg: 100, cim: 'Ablakom' );

Konfigurációs objektum 25 Előnyei Nem kell a paraméterek sorrendjére emlékezni Opcionális paraméterek kihagyhatók Olvashatóbb, karbantarthatóbb kód Könnyebb hozzáadni, elvenni paramétereket Hátrányai Emlékezni kell a paraméterek nevére Nem tömöríthető (minify) Hasznos DOM elemek készítésénél CSS tulajdonságok megadásánál

26 Függvénykifejezés használata

Kifejezés használata 27 //literál 6 //értékadás var szam = 6; //Objektum adattagja var obj = { szam: 6 ; //Visszatérési érték var inic = function () { return 6; //Használva 6 //Kifejezés if (6 === 6) { console.log('igaz'); //Függvényparaméter var f = function (p) { return p; f(6);

Függvénykifejezés használata 28 //literál function (a, b) { return a * b; //értékadás var szam = function (a, b) { return a * b; ; //Objektum adattagja var obj = { szam: function (a, b) { return a * b; ; //Visszatérési érték var inic = function () { return function (a, b) { return a * b; ; //Használva (function (a, b) { return a * b; )(2, 3); //Kifejezés if ((function (a, b) { return a * b; )(2, 3) === 6) { console.log('igaz'); //Függvényparaméter var f = function (fv, a, b) { return fv(a, b); f(function (a, b) { return a * b;, 2, 3);

29 Önkioldó függvény Névterek, privát névtér, névtér függvény

Globális névtér 30 Minden függvényen kívül létrehozott változó a globális névtér része Ez a böngésző esetében a window objektum Minél kevesebb globális változónk legyen a névütközések, felüldefiniálások elkerülése végett var mit = function() { window.globalis = 'Juppi, globális vagyok'; // közvetlen a globális névtérbe hozzuk létre return 'azt'; mit(); // => 'azt' window.mit(); // => 'azt' console.log(globalis); // => 'Juppi, globális vagyok' console.log(window.globalis); // => 'Juppi, globális vagyok'

Globális névtér 31 /* TELJESEN EGYEDI ALKALMAZÁSOM */ var megy = function() { return 'ÉS MÉG MEGY!';, megall = function() { return '...ÉS MEGÁLL'; ; megy(); // => 'ÉS MÉG MEGY!' megall(); // => '...ÉS MEGÁLL' //... // Később, ugyanabban a kódban előfordulhat: /* XY. BÉLA GONOSZ ALKALMAZÁSA */ var megy = function() { return 'Béla a király!'; megy(); // => 'Béla a király!', felülírta az én alkalmazásom függvényét

Saját névtér 32 Változó hatóköre az őt deklaráló függvény Ezzel névterek létrehozhatók Függvényen belül definiált változók, függvények nem befolyásolják a program ezen kívüli részét /* MAJDNEM EGYEDI NÉVTÉRBEN TELJESEN EGYEDI ALKALMAZÁSOM */ var duracellnyuszi = function() { var megy = function() { return 'ÉS MÉG MEGY!';, megall = function() { return '...ÉS MEGÁLL'; ; megy(); // => 'ÉS MÉG MEGY!' megall(); // => '...ÉS MEGÁLL' duracellnyuszi(); // Most már akárhogy gonoszkodhat XY. Béla, nem tud belenyúlni az ő alkalmazásával a miénkbe.

Önkioldó függvény 33 Ha csak a névtér miatt hozzuk létre a függvényt, akkor felesleges nevesíteni, hiszen csak a globális névteret szennyezzük vele önkioldó névtelen függvény: olyan függvény, amit létrehozás után rögtön futtatunk is Később nem tudunk rá hivatkozni Példa Oldalbetöltődéskor eseménykezelők definiálása, objektumok létrehozása Temporális változók

Önkioldó függvény 34 A) Önkioldó függvény definiálása /* TELJESEN EGYEDI NÉVTÉRBEN TELJESEN EGYEDI ALKALMAZÁSOM */ (function() { var megy = function() { return 'ÉS MÉG MEGY!';, megall = function() { return '...ÉS MEGÁLL'; ; megy(); // => 'ÉS MÉG MEGY!' megall(); // => '...ÉS MEGÁLL' ()); B) Önkioldó függvény paraméterezése (function(a, b) { console.log(a+b); (1,2)); // => 3 C) Önkioldó függvény visszatérési értéke var ize = (function(str) { return str; ('bize')); console.log(ize); // => 'bize'

35 Függvény mint paraméter Callback minta

Függvény mint paraméter 36 A függvények objektumok, így átadhatók paraméterként Sokrétű, általános logikájú függvények kaphatók A paraméterként megkapott függvényt visszahívja callback függvény, callback minta Felhasználása Eseménykezelők Időzítők Függvénykönyvtárak

Függvény mint paraméter 37 var showhero = function(name, callback) { console.log("i'm " + name); if (callback) { callback(); ; showhero('superman', function() { console.log('callback invoked!'); ); // => "I'm Superman" // => "Callback invoked!"

Függvény mint paraméter 38 var egyenletmegoldo = function(a, b, muvelet) { var vegeredmeny; if (!muvelet typeof muvelet!== 'function') { console.log('nem adott meg műveletet!'); return false; console.log('művelet a(z)', a, 'és a', b, 'értékeken!'); vegeredmeny = muvelet(a,b); console.log('az eredmény: ', vegeredmeny); return vegeredmeny; egyenletmegoldo(3,4); // => false, a logban: 'Nem adott meg műveletet!' // Egyszerű szorzás egyenletmegoldo(3,4, function(a,b) { return a * b; ); // => 10, a logban: Művelet a(z) 3 és a 4 értékeken! Az eredmény: 12

Függvény mint paraméter 39 Időzítőben Külön függvényként csak a referenciát kell átadni Eseménykezelőknél is //Külön függvényként var elkesem = function () { console.log('500ms-ot késtem...'); ; settimeout(elkesem, 500); //Függvényliterállal settimeout(function () { console.log('500ms-ot késtem...');, 500);

Paraméteres callback 40 var numarray = [1,2,3].map(function(el) { return el * 2; ); assertequals([2, 4, 6], numarray);

41 Függvény mint visszatérési érték

Függvény mint visszatérési érték 42 Függvények objektumok, ezért visszaadhatóak Függvény visszatérési értéke függvény Függvénygenerátorok var setup = function () { console.log(1); return function () { console.log(2); ; ; var fv = setup(); // 1 fv(); // 2

Függvény mint visszatérési érték 43 Mi van abban az esetben, ha a külső függvény egy lokális változójára hivatkozom? var setup = function () { var lokalis = 1; return function () { console.log(lokalis); ; ; var fv = setup(); fv(); //???

44 Closure

Closure 45 Zárlat, lexikális scope Belső függvény hivatkozhat a külső függvény változóira (függvény scope) az után is, hogy a külső függvény már lefutott Egy változó addig marad életben, amíg esély van arra, hogy bárki használja őket Closure egy környezet, amiben a változók definiálva vannak Szemétgyűjtő szabadítja fel, ha nincs rá referencia

Closure - példák 46 Függvény mint visszatérési érték Időzítő var setup = function () { var lokalis = 1; return function () { console.log(lokalis); ; ; var fv = setup(); fv(); // 1 var valogatott = function() { var statusz = 'Győztünk!'; var mitortent = function() { console.log(statusz); settimeout(mitortent, 1000); valogatott(); // 1mp múlva megjelenik: 'Győztünk!'

Függvényalkotó 47 Egymáshoz hasonló feladatoknál a paraméter //Sokszor megadásának ugyanolyan kiváltására paraméterrel használt függvény var hozzaad = function (mihez, mit) { return mihez + mit; console.log(hozzaad(1000, 42)); //1042 console.log(hozzaad(1000, 111)); //1111 //Függvényalkotó var specialishozzaadotalkoto = function(mit) { return function(mihez) { return mihez + mit; var hozzaad1000 = specialishozzaadotalkoto(1000); console.log(hozzaad1000(42)); //1042 console.log(hozzaad1000(111)); //1111

Closure hátrányai 48 Például ciklusnál (function() { var i; for (i = 0; i < 3; i += 1) { settimeout(function () { console.log(i);, 500); )(); //Output // 3 // 3 // 3

49 Függvény mint objektum

Függvény mint objektum 50 A függvények is objektumok: vannak adattagjaik és metódusaik prototype: egy objektum, aminek egyetlen constructor nevű adattagja a függvényre mutat length: függvény formális paramétereinek száma apply(): ld. később f.prototype constructor call(): ld. később Két rejtett attribútum f() függvény kontextusa (ld. closure) prototype függvény kódja Az egyetlen különlegessége a függvényeknek az objektumokhoz képest, hogy meghívhatók

Függvény mint objektum 51 var fgvobj = function () { return 'Meghívtál, visszatértem'; ; //Saját adattagok hozzáadása fgvobj.adat = 'Adat vagyok'; fgvobj.metodus = function () { return this.adat; ; console.log(fgvobj()); //'Meghívtál, visszatértem' console.log(fgvobj.metodus()); //'Adat vagyok'

Memoization minta 52 Költséges művelet eredményének tárolása var myfunc = function () { var cachekey = JSON.stringify(Array.prototype.slice.call(arguments)), result; if (!myfunc.cache[cachekey]) { result = {; //... expensive operation... myfunc.cache[cachekey] = result; return myfunc.cache[cachekey]; ; // cache storage myfunc.cache = {; var myfunc = function (param) { if (!myfunc.cache[param]) { var result = {; //... expensive operation... myfunc.cache[param] = result; return myfunc.cache[param]; ; // cache storage myfunc.cache = {;

53 A this jelentése

Függvényhívási minták 54 Függvények hívásakor minden függvény két további paramétert kap a deklarált paraméterek mellé this arguments A this értéke a függvényhívás módjától függ Függvényhívási minták Metódushívási minta Függvényhívási minta Alkalmazkodó függvényhívási minta Konstruktorhívási minta

Globális kontextus 55 // A böngészõkben a globális objektum a window assertequals(this, window); this.hero = 'Superman'; assertequals('superman', window.hero);

Metódushívási minta 56 Ha a függvény egy objektum adattagja, akkor metódusnak hívjuk A this az adott objektumra mutat var facebook = { tagok: ['Tamás', 'Thomas', 'Tuomas', 'Etelka'], regisztraltak: function() { return this.tagok; //Metódushívás: facebook.regisztraltak(); // => ["Tamás", "Thomas", "Tuomas", "Etelka"]

Függvényhívási minta 57 Ha egy függvény nem metódusa egy objektumnak, akkor a globális névtérben jön létre Hagyományos függvények A globális objektum (window) része lesz this: undefined(strict mode) vagy globális (egyéb) var fgv = function () { console.log(this); //Függvényhívási minta fgv(); //window console.log(fgv === window.fgv); window.fgv = function () { console.log(this); //Függvényhívási minta window.fgv(); //window console.log(fgv === window.fgv);

Hívás módja a lényeg 58 var hero = { name: 'Superman' ; function getname() { return this.name; ; // A függvényre mutató referenciát később adjuk hozzá a // hero objektumhoz, ha így, metódusként hívjuk meg // akkor a this az objektumra fog mutatni: hero.getname = getname; assertequals('superman', hero.getname()); assertequals(undefined, getname());

Függvényhívási minta 59 Belső függvényben a this a globális objektumra mutat (nyelvtervezési hiba ES5 strict mode) var name = 'Sugarman', hero = { name: 'Superman', getintroductionhtml: function() { var formattedname = function(tag) { return '<' + tag + '>' + this.name + '</' + tag + '>'; ; return '<div class="name">' + formattedname('span') + '</div>'; ; assertequals('<div class="name"><span>sugarman</span></div>', hero.getintroductionhtml());

Függvényhívási minta 60 Megoldás: this kimentése _this, that, self vagy strict mode TypeError var name = 'Sugarman', hero = { name: 'Superman', getintroductionhtml: function() { var that = this; var formattedname = function(tag) { return '<' + tag + '>' + that.name + '</' + tag + '>'; ; return '<div class="name">' + formattedname('span') + '</div>'; assertequals('<div class="name"><span>superman</span></div>', hero.getintroductionhtml());

Alkalmazkodó függvényhívási minta 61 Függvénynek lehetnek saját metódusai A call() és apply() segítségével megmondhatjuk, hogy a függvény this paramétere melyik objektumra mutasson (első paraméterük) apply() második paramétere argumentumok tömbje call() 2., 3., stb. paramétere a függvény 1., 2., stb. paramétere lesz bind(): a függvény kontextusát véglegesen a paraméterül megadott objektumhoz köti

Alkalmazkodó függvényhívási minta 62 var facebook = { tagok: ['Tamás', 'Thomas', 'Tuomas', 'Etelka'], regisztraltak: function() { return this.tagok; var iwiw = { tagok: ['Csobilla', 'Csende', 'Cseperke'] var tagok = ['Géza', 'Gizi']; facebook.regisztraltak(); // => ['Tamás', 'Thomas', 'Tuomas', 'Etelka'] facebook.regisztraltak.apply(iwiw); // => ["Csobilla", "Csende", "Cseperke ]

Alkalmazkodó függvényhívási minta 63 Ha nem számít a this Csak a paraméterezés var numbers = [5, 6, 2, 3, 7]; // Keressük meg a legnagyobb értéket a tömbben. A // Math.max paramétereiben számokat vár, és azok // közül választja ki a legnagyobbat. Az apply tökéletes // választás, hiszen a tömböt argumentumokra bontja // és így hívja meg a Math.max-ot: var max = Math.max.apply(null, numbers); assertequals(7, max); //ES6 spread operator var numbers = [5, 6, 2, 3, 7]; var max = Math.max(...numbers); assertequals(7, max);

Alkalmazkodó függvényhívási minta 64 var name = 'Sugarman', hero = { name: 'Superman', getintroductionhtml: function() { var formattedname = (function(tag) { return '<' + tag + '>' + this.name + '</' + tag + '>'; ).bind(this); return '<div class="name">' + formattedname('span') + '</div>'; assertequals( '<div class="name"><span>superman</span></div>', hero.getintroductionhtml());

Lambda kifejezés kontextusa (ES6) 65 Mindig az az scope, amiben definiáltuk var hero = { name: 'Superman', getintroductionhtml: function() { var name = (tag) => '<' + tag + '>' + this.name + '</' + tag + '>'; return '<div class="name">' + name('span') + '</div>'; assertequals( '<div class="name"><span>superman</span></div>', hero.getintroductionhtml());

Konstruktorhívási minta 66 Mivel nincsenek osztályok, ezért az operandusául kapott függvény lefuttatásával új objektumot hoz létre this egy olyan objektumra mutat, amelyet a függvény visszaad a new operátornak var Facebook = function () { this.tagok = ['Tamás', 'Thomas', 'Tuomas', 'Etelka']; this.regisztraltak = function () { return this.tagok; var a = new Facebook(); a.regisztraltak(); // => ["Tamás", "Thomas", "Tuomas", "Etelka"]

Összefoglalás 67 Függvények létrehozása Változók a függvényekben Függvények paraméterezése Függvénykifejezés használata Önkioldó függvény Függvény mint paraméter Függvény mint visszatérési érték Closure A függvény mint objektum A this jelentése