új javascript funkció

                                                  

mindig egy új fájllal kezdődik. de ez már csak a vége. előtte van még egy rendkívül fontos, ámbár gyakran időben töredékannyit kitevő rész: tervezés. itt a legfontosabb a minél több és minél pontosabb elvárás írásba foglalása. ilyenkor még nem kell hogy kössön a technológiai korlát. ez a fantázia világa. nem erről lesz most szó. amiről most szó lesz, az a tényleges kódolás, amikor betáplálom az utasításokat a kompjúterbe.

szóval ott az üres fájl. de miért üres? hiszen lehetnének template-jeim. van is egy, de inkább csak a kollégáimnak szoktam ajánlgatni, nekem már a fejemben van. ezen kivül az sem jó mindenre, és amit most ecsetelni fogok arra például pont nem. aztán, beleírom hogy alert(1). ennyit és nem többet, majd behúzom az imént elkészített, nem túl hosszú javascript fájlt. feleslegesnek tűnhet ez a lépés, de nem az. igazából az van, hogy nem vagyok egy sitebuilder, tördelő. használom ugyan a html-t, de nincs a fejemben nemhogy az összes doctype, de még egy sem teljes egészben. minek is lenne erre szükség, hiszen minden site más és más. és persze az alap szintaxissal tisztában vagyok, de hibázhatok. ezzel az egyszerű 8 byteos teszttel arról győződök meg, hogy minden a legnagyobb rendben van. sikerült a html-t úgy megszerkesztenem, hogy behúzza, és csak egyszer húzza be, jókor húzza be. kétségkívül fontos utólag, ám gyakran elhanyagolt lépés ez. feleslegesnek tarthatja az aki napi szinten húz be js fájlokat és ránézésre kiszúrja ha valami nem stimmel. én nem ilyen vagyok, viszont egy-két baleset óta egyszerűen képtelen vagyok kihagyni ezt a crossbrowser tesztet.
nem lesz ám ilyen terjengős végig, csak a munka legnagyobb része ez volt, ezért mindenképp szerettem volna, ha az elejével tisztában vagyunk. és mint írtam, ha ez sikerrel működik, a böngésző alertel, akkor bizony a nehezén már túl is vagyunk. ami ezután jön az már csak favágó munka, és még a bazári majmok is képesek megcsinálni - ha adunk nekik elég időt rá. na de nézzük tovább: természetesen miután kiderült hogy megjelenik az alert minden célböngészőben (a tervezés során ez is definiálva lett, hogy minimálisan hol kell hogy fusson) meg is semmisíthetjük ezt a tesztet, úgyis csak az elindulásunkat segítette. hogyan tovább?
akinek ismerős az hogy miért kell tisztán tartani a globális névteret, az ezt a részt átugorhatja. az internet egy ilyen névtelen dolog. nagyon sok helyen megadhatod a neved - akár különbözőeket is - sőt, előfordulhat hogy valakinek éppenpont ugyanaz a neve, mint neked. ugyanez a helyzet az internetben használt javascriptekkel is. illetve az azokban használt azonosítókkal. bárki bármit használhat. amíg csak saját használatra készítünk egy specializált megoldást, addig nem számít ha ezek a nevek "kibugyognak" (erre majd mindjárt visszatérek), de ha több dolgot, libeket, több saját fejlesztést használunk akkor ezek összeütközhetnek és jön a nagy bumm. na jó, nem lesz bumm, legfeljebb egy hibajegy, de így jobban hangzik. szóval mi az hogy kibugyog? most hadakozhatnék olyan szavakkal mint closure, meg scope, és akkor úgy tűnne, hogy nagyon értek hozzá, de nem érdekel ez a látszat, úgyhogy maradok a konyhanyelvnél. szóval ha egy teremben vagyunk, mondjuk ketten, akkor nem okoz gondot az a megszólítás hogy "figyelj csak". tudjuk hogy mindig a másiknak szól. ha már kettőnél többen vagyunk, akkor ez bizony bajos lehet, ezért ekkor már neveket szoktunk mondani. pl: "róka, igyál már egy sört" ez is jó sokáig működhet, de viszonylag hamar eljön az idő, amikor lesz a szobában két gábor, vagy három béla. eleinte még vicces is a dolog, aztán inkább zavaró. több opció is van megoldásra. levelezésben például lehet k. bélát írni kovács bélának, és t. bélát tóth bélának. ez amúgy kód szintjén a prefixeket jelenti. furamódon pont az én nevemből képzett ilyen névből éppen három van a munkahelyemen. mit lehet még tenni? lehet különböző beceneveket használni, mint például a róka. egy darabig ez is működik, de azért valakinek mégiscsak az a neve ami a neve, az a legjellemzőbb rá. nem is mindenki szereti ha ragadványneveket akasztanak rá. van egy harmadik opció is, ez pedig eltávolodik a személytől: mindenkit úgy szólítunk ahogy jólesik (például béla) de egy akkora szobába tesszük, ahol ez biztosan nem okoz gondot. az azért már mégiscsak ritka hogy mindkét béla pontosan ugyanazokat a dolgokat tudja. nyilván az egyik tud autót szerelni, a másik pedig kávét főzni. ilyenek ezek a bélák. akinek nem lenne világos, annak elárulom hogy egy szoba egy scope-nak felel meg. más szobában lévő bélát a megfelelő útvonallal lehet megcímezni: alagsori béla, vagy Math.sin(). ez persze visszafelé is igaz, hogy az alagsori béla szobájában a hatodikon lévő béla megszólítása: "béla a hatodikról". de mi van ha ez egy felhőkarcoló, és különben sem érdekel senkit az alagsorban hogy ki dolgozik felette. pontosan ez a valós helyzet. az alagsorban laknak a beépített objektumok, felette meg a mi kódjaink. a mi kódjainkat jó eséllyel csak mi hívogatjuk, de legdurvább esetben is adunk egy névjegykártyát az alagsori illetőnek, hogy ekkor meg ekkor hívj fel. (értsd: callback) ha már így alakult, és senkit nem érdekel a szint neve ahol dolgozunk, akkor minek neki név? főleg hogy a szint neve épp olyan mint a béla neve, csak azt hisszük hogy mivel kevesebb van belőle ezért ritkábban ütközhet össze. ez nem így van. gondoljunk csak arra hogy mindenkinek lehet egy Utils nevű objektuma. el tudja valaki képzelni, hogy mi lesz akkor ha ketten is definiálják a Utils objektumot más-más tartalommal? elárulom: az első nem olyan jól fog működni, és ez okozhatja a második hibáját is. a megoldás pedig egyszerű: ne nevezzük el amit nem muszáj. a változóknak kell nevet adni, mert ilyen ez a nyelv. de a scope-oknál van lehetőségünk ezt kispórolni. létrahozunk egy névtelen scope-ot. nem kell nagy mágjára gondolni, csak egy névtelen függvény definíciójáról, majd meghívásáról van szó.
mikor fontos ez? ha azt tervezzük hogy a mi kis megoldásunk lesz a világon elterjedt megoldások leváltója, és arra számítunk hogy több millió weboldal a legkülönbözőbb környezetekben fogja majd a mi kódunkat futtatni. nem így van? persze hogy nem. az esetek majdnem 100%-ában nem ez a helyzet, azonban ha nem erre készülünk akkor saját magunkat is megszivathatjuk: képzeljük el, hogy ugyan nem világszenzáció amit készítünk, de legalább a fejlesztőnek tetszik, és az egy hónap múlva induló fejlesztésében is szeretné használni. a következő fejlesztés feltehetően más libeket, más neveket hoz. ilyenkor külön erőfeszítést kell tenni, hogy az ember letisztázza, hogy ezek bizony nem zavarják egymást. ugyanez egy év távlatából már nagyon jeletős többletráforditást jelent. nos én azt javaslom hogy a saját kis kódunkkal ne kössük meg a kezünket a népszerűség útján, legyen mindig bezárva egy névtelen függvénybe, és hagyja sértetlenül a globális névteret. lehetnek kivételes esetek, de mint neve is mutatja, ennek kell lenni a kivételnek és a többletráfordításnak, nem pedig a gyakran ismétlődő dolognak.
azt hiszem, hogy az első kódsoron már túl is vagyunk, illetve az utolsón is. tételesen a három pont előtti majd utáni részről írok: ;(function(){...})();
azért még egy pár szót elvesztegetnék az első és utolsó karakterekre. kis project esetén, meg ilyen "csakmostgyorsan" esetén semmi jelentősége. sőt, sok esetben máskor sem. olyan ez mint a népszerű kód amiről az elsőbb irtam. egy olyan apró megszokás ami nem túl költséges, gondolkodást nem igényel, viszont alkalmassá tszi a renszerünket arra hogy igazán nagy és változatos környezetben is jól működjön. tudni kell, hogy javascriptben nem kötelező a sorvégi pontosvessző. én örülök ennek. azonban lehetőséget ad hogy kitegyük. én ennek nem örülök, de hát így alakult. amig egy sorba egy utasítást írunk, addig nincs ebből baj. a baj akkor kezdődik ha egy sorban többminden is van. most akkor kitegyük vagy ne? hamar megválaszolom a türelmetlenek kedvéért: tegyük ki, viszont ne forditsunk arra időt hogy mások kódjába pontosvesszűket szúrjunk. és visszakanyarodva a magyarázathoz: lehet persze úgy fejleszteni hogy kínosan ügyelünk hogy minden külön sorba kerüljön. jónak tűnhet amit csinálunk, de nem az. tudni kell hogy a javascript fájloknak van egy élettútjuk. amikor megszületnek akkor még csak egy üres fájl. aztán jól felnőlnek, meghíznak, kiteljesednek. a fejlesztési időszak végére ez az állapot áll elő. ezután akárcsak a múmiákat: betekerik fáslival és hagyják kiszáradni amitől összezsugorodnak. na jó, nincs fásli, de a build folyamat sok esetben tömöríti a kódot. sőt mi több össze is fűzheti más kódokkal, hogy ne sok kis js fájl legyen használatban hanem egy nagyobb. és ez az a pont ahol jelentősége van a pontosvesszőknek. lehet hogy az a rendszer amibe épp fejlesztünk nem ilyen. de bármikor megszülethet az a döntés, hogy legyen tömörített a javascript - hiszen azonos átalakításról beszélünk, ezért működést nem szabad hogy befolyásolja. és hogy ténylegesen ne is legyen baj, ezért mi jól kitesszük a mi pontosvesszőinket. sőt, készülünk az összefűzésre is, és arra is hogy más nem olyan előrelátó mint mi, és a végéről lemarad, mi pedig épp utána kerülünk. a mi kódunk első karaktere is legyen ez, mert így lezárhatjuk az esetleges előző lezáratlan utasítást. a végén meg természetes az előbbiek alapján. két apró karakter amely kerékkötője lehet a fejlődésnek. ne legyen. fejlesztési időben talán egyetlen másodperc ezt begépelni, viszont kiélesített rendszeren tömörített js fájlok összefűzött hányadékán megkeresni egy ilyen hibát... hosszú órákig tarthat - akár napokig - arról nem is beszélve, hogy a javitócsomagot élesíteni is eltarthat egy ideig.
nekilátunk már kódot írni? persze, de az alapokat jó volt kicsit feleleveníteni. szóval van terv, induljunk ki ebből. ha nincs akkor legyen, követeljük meg, annak minden fent említett részletével. döntsük el hogy a kódunk használ-e és ha igen akkor milyen libeket. legjobb ha ezeket beleírjuk kommentbe is, hogy az utókor tudja, hogy azért is eltörhet a 2601. sorban, mert nincs behúzva mellé a fancybox.js. akkor sem szabadna ezt kihagyni ha valamilyen függőségkezelőt használunk. szóval megvan minden ami kell, akkor már csak egy dolog hiányzik: egy kiadós try-catch blokk. na mégis miért? hát természetesen azért, hogy lenyeljük a hibákat. éles környezetbe ne türemkedjen elő még log-ra se egy "undefined értéke null, vagy nem objektum" vagy "fityegő kombinátor" vicces üzenet.