Let there be a cool variable (JS)

 

Nemrégiben tettem fel facebookon a találós kérdést, hogy mi lesz a végeredménye ennek a kódnak:

for (var i=0; i < 3; i++) {
setTimeout(function() { console.log(i); }, 100 * i);
}

Érkezett helyes megoldás azonban a "miért" nem teljesen pontos. Szóval öntsünk tiszta vizet a pohárba.

A helyes válasz "természetesen" az hogy 3 3 3. Pedig sokan a 0 1 2 -őt várnák megoldásnak. Nem csoda, ez az egyik sarkalatos pontja a JavaScript nyelvnek ami miatt oly sokan utálják. Aki már jó ideje használja a JS-et az természetesen ismeri ezeket a "trükköket".

 

Na vizsgáljuk meg közelebbről, hogy mi történik valójában:

  • A for ciklus, ciklusváltozója az i.
  • A ciklusmagon belül kiadott setTimeout utasítás egy késleltetett futtatást tesz lehetővé.
  • A benne megadott névtelen függvény kódja háromszor fog lefutni késleltetve. Az első 0 a második 100 míg a harmadik 200ms múlva.
  • A névtelen függvény kódja kiírja a konzolra az i változó értékét.

Na de milyen értéket! Mind a három kiíratáskor az i ugyanazt a változót jelöli, ugyanarra a memóriaterületre "mutat". Azonban mindhárom kiíratás késleltetve fut le, akkor amikor az i változó értéke már 3. Tehát magyarán a ciklus hamarabb lefut mint a ciklusmagban lévő kiíratás, amikor is az i értéke már a végérték+1 -et tartalmazza.

 

Hogy miért 3 és miért nem 2?

Nos aki nálam tanult bevezetés a programozásba című tárgyat, az tudja, hogy a for ciklus, ciklusváltozója a ciklus lefutása után (szabályos befejezés esetén) azt az értéket tárolja
- amelyre utoljára futott le a ciklus
vagy
- amire már éppen nem futott le a ciklus.

Hogy melyik az igaz? Az attól függ. Nyelvenként eltérő. Mindenesetre a JS az utóbbit vallja.
Tehát 3 lesz az értéke, mert erre már nem fut le a ciklus. Nem teljesíti a feltételt.

 

Hogyan érhetem el a 0 1 2 eredményt?

Több eshetőség is van. Az első példában a leggyakoribb megoldást használjuk az IIFE (Immediately Invoked Function Expression) technikát. Ebben az esetben a ciklusmag kódját "bebugyoláljuk" egy függvénybe (zölddel jelölve a kódban) aminek az i ciklusváltozót átadjuk paraméterül, és ezt a szintén névtelen bebugyolált függvényt azonnal meg is hívjuk. Ezáltal az i hatásköre a függvényhez fog kötődni ami a megfelelő értéket adja neki mindhárom esetben.

Íme a kód:

for (var i=0; i < 3; i++) {
(function(i) {
setTimeout(function() { console.log(i); }, 100 * i);
})(i);
}

Tudom, nem túl szép, de működik az összes JS verzióval.

 

Szépítsünk picit és használjuk az új Ecmascript6 adta lehetőségeket:

for (let i=0; i < 3; i++) {
setTimeout(function() { console.log(i); }, 100 * i);
}

A var kulcsszó helyett a let-et használva egyből megoldódik a problémánk. cool Hát nem szép? De. Csak sok böngésző még nem támogatja.
Főleg az IE csak a 11-es verziótól kezdve. Bővebb infó itt: caniuse.com

 

Nos ha már Ecmascript6 akkor szépítsük tovább és használjuk az arrow függvényt. Ez most úgy is divatba jött több programnyelvnél is:

for (let i=0; i < 3; i++) {
setTimeout(() => console.log(i*100), 100 * i);
}

 

Ezzel végére is értünk a probléma elemzésének. Remélem sikerült mindent tisztázni ezzel kapcsolatban.

 

Zárógondolatként pedig egy link. Amikor JS-ben leírom a let kulcsszót, nekem mindig ez ugrik be laughing

youtube

 

Felkészítő óra

Május 19. 8:50 – 14:00 Java gyakorlati felkészítő óra a G1 teremben, összevontan a nappalisokkal és estisekkel egyben.

Gyakorló feladat az Április 21. dolgozathoz

Nem találtam adatbázis kezelős feladatot gyakorlásra, ezért az adatbázist is maguknak kell hozzá megtervezni. A feladat1-hez a nappalisokkal készítettünk egy példa adatbázist, hasonlót lehet készíteni a feladat 2-höz.

A feladat 2 + a kiegészítés(txt) az a gyakorló feladat ami inkább hasonlít a csütörtöki dolgozathoz.

04_21_gyakorlo

Szoftverfejlesztő vizsgaidőpontok 2016

Komplex alkalmazás (szoftver) készítése (Java)

Időtartam: 240 perc

Idő: 2016.05.24.  13:00 - 17:00

 

Elméleti vizsga

Záródolgozat védés: 2016.05.27 8.00-15.00

Tételsor felelés: 2016.05.27 8.00-12.55

 

Felelések időpontja SZF21

Hétfő (április 11) Szerda (április 13) Péntek (április 15)
Márton Norbert 2
Bucskó Andrea 12
Kozma Krisztián 16
Szabó Levente 7
Tóth Norbert 15
Lukovics Georgina 17
Csipkés Gergő 6
Csepei Zoltán 14
Ábrók Csaba 3
Kantár Csaba 1
Kecskés József Ákos 13
Bíró Máté 4
Nagy Lajos 10
Kovács Roland 18
Plank Roland 5
Filep Zsolt 11

Komplex vizsga jelentkezési lap

Az SZF21 osztályból, mindenkinek jelentkeznie kell a komplex szakmai vizsgára legkésőbb péntekig.

Aki beteg és a héten nem tud jönni, órákra, az legalább a titkárságon jelenjen meg hogy alá tudják írni. Ha ez sem megoldható, akkor írjon email a címemre.

 

Brackets extension frissítés

0.9.3-as verzióra frissítettem a Numbered Bookmarks extension-t.

Letölthető közvetlenül a brackets extension registryből vagy githubról.

 

Újdonságok:

  • #2 és #3 -as hibák javítása
  • folded és unfolded sorok jelölése
  • sexi animáció amikor a sorra ugrunk

Használat:

Könyvjelző lerakása: CMD/CTRL+ALT+SHIFT+1..9

Könyvjelzőhöz ugrás: CMD/CTRL + 1..9

Félévi javítások pótlások, jegyek

 

Játékszabályok:

Fontos! Pénteken már nincs javítási lehetőség az alábbi időpontokban lehetséges csak a javítás.

Megj.: A javító dolgozatok eredményei minden esetben bekerülnek, akkor is ha rosszabb mint az eredeti. Az eredeti jegy is megmarad, nem cserélődik le az újra.

 

 

SZF21

jegyek
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Miből lehet pótolni/javítani:

Programozási nyelvek gyakorlat 2 dolgozat javítható/pótolható:
Az első ami a c fa depó volt és a második dolgozat a Java gui kollekció (cipő).
Alkalmazás fejlesztés elmélet:
Nincs javítás már. A javításokat már letudtuk elméletből. Aki rosszul áll az következő félévben kijavítja.
Alkalmazásfejlesztés gyakorlat 2 dolgozat javítható/pótolható:
A második dolgozat (java konzolos kis feladatok) és a harmadik dolgozat (OOP algoritmizálás)
Webalkalmazás fejlesztés elmélet:
A css papír alapú dolgozatot lehet javítani/pótolni.
Webalkalmazás fejlesztés gyakorlat:
A css gyakorlati dolgozatot lehet javítani, a HTML-ből már vólt pót, a beadandó pótlására nincs lehetőség.
Oprendszer elmélet:
Mivel nagy az érdeklődés a 2. és 3. fejezetből ír mindenki összevont dolgozatot. A dolgozat xls alapú teszt + kifejtős
Oprendszer gyakorlat:
Aki kétesre áll attól egy-egy elméleti kérdést fogok feltenni szintén a 2. és 3. fejezetből. Ez rövid lesz és nem teszt.

 

 

Időpontok:

Hétfő:
Operációs rendszer elmélet gyakorlat
Szerda:
Alkalmazásfejlesztés gyakorlat 2 dolgozat
Webalkalmazás fejlesztés gyakorlat
Csütörtök:
Programozási nyelvek gyakorlat 2 dolgozat
Webalkalmazás fejlesztés elmélet

 

 

SZF21e

jegyek
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Programozási nyelvek gyakorlat:
1. és 2. dolgozatot lehet javítani/pótolni. Csütörtökön a nappalisokkal.
Alkalmazásfejlesztés elmélet:
1. dolgozatot a programozás elméletet lehet pótolni Szerdán
Alkalmazásfejlesztés gyakorlat:
1. és 2. dolgozatot lehet javítani/pótolni. Szerdán a nappalisokkal.
Webalkalmazás fejlesztés elmélet:
A HTML-ből XLS alapú dolgozatot lehet javítani/pótolni csütörtökön.
Webalkalmazás fejlesztés gyakorlat:
Nincs javítási lehetőség.
Oprendszer elmélet:
Akinek javítani kell az a 3. fejezetből javíthat XLS alapú teszt dolgozat. Szerdán 17:20-tól a G2-ben.
Oprendszer gyakorlat:
Aki a beadandót még nem adta be, sürgősen adja be, de maximum kettes lehet és csak akkor ha minden rendben vele és igényes nem öszecsapott munka.

 

Betegségem miatt a mai napi feladat: Java + adatszerkezetek

Még mindíg nem vagyok túl jól, szóval, jöttömre három nap múltán számítsanak, délben, észak felől.

Addig is a mai napi gyakorló feladat témája a Java és az adatszerkezetek. Egy könyebb és egy nehezebb feladattal.

Lássuk őket:

  1. (könnyebb) Valósítsa meg az asszociatív tömb adatszerkezetet Java nyelven saját osztállyal.  Gondoljanak arra hogyan működik az asszociatív tömb, miket tud, hogyan lehetne ezt a funkcionalitást sima tömbökkel vagy kollekciókkal megoldani.
  2. (nehezebb) Valósítsa meg a verem adatszerkezetet Java nyelven saját osztállyal. A megvalósítás során használjon saját kivételeket. pl.: Ha túl sok elemet akarunk kivenni a veremből, akkor dobjon egy saját kivételt. Szintén, gondolják végig, hogyan működik a verem adatszerkezet.

A feladatok némi kutatómunkát igényelnek, főként mert a saját kivételt még nem vettük, de az erő önökkel lesz.

2019 © Robert Girhiny