Poslao: 28 Jan 2018 21:55
|
offline
- Stephanos
- Zaslužni građanin
- Pridružio: 03 Feb 2015
- Poruke: 501
|
vasa.93 ::Drug Elite ti reče: E.L.I.T.E. ::Ovo nije vezano samo za JavaScript već za bilo šta što programiraš. Da bi naučio da razmišljaš kao programer potrebno je vreme, ali moraš i sam da uložiš određeni trud
A valjda znaš i shvataš šta radi metoda setInterval?
Naravno, ona sluzi da izabrana funkcija radi non stop, u ovom mom slucaju, ona prikazaju date slike koje sam joj ja dao da izbacuje i vraca se ispocetka sa prikazivanjem. Trudim se da shvatim svaki kod koji iskucam, interesujem se da ga razumem.
Rastafarii ::document.getElementById("current").src = images[i++];
if (i === images.length) {
i = 0;
}
Bonus pitanje: zasto je ovo moguce?
Druze, nisam stigao do dela kada se koristi " ===" , ali predpostavljam da zamenjuje i<image.length-1, druga mogucnost za koju mislim je ta da images i dalje ima vecu cifru od "if" dodavsi images[i++]
|
|
|
Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
|
|
Poslao: 28 Jan 2018 22:37
|
offline
- vasa.93
- Moderator foruma
- Pridružio: 17 Dec 2007
- Poruke: 14824
- Gde živiš: Niš
|
Napisano: 28 Jan 2018 22:17
Rastafarii ::Stativa. Prvo vrati vrednost, pa je onda inkrementira. Da je ++i, onda bi prvo inkrementirao.Tačno. Permutovao sam prefiksni i postfiksni ++. Kako god, koliko sam skontao, tvoja suština nije bila u tome kada će inkrementiranje da se vrši (isti efekat bi mogao da se postigne i korišćenjem prefiksnog inkrementiranja, ali na drugom mestu), već u tome da ono vraća svoju vrednost koja može da se smesti u indekser i time skrati dodatna linija koja će da radi samo inkrementiranje i da se shodno tome prilagodi uslov i pojednostavi kod. Zar ne?
Dopuna: 28 Jan 2018 22:37
Stephanos ::Naravno, ona sluzi da izabrana funkcija radi non stop...Uh, jako diskutabilno razumevanje. Predata funkcija ne radi non stop, već se samo poziva u zadatom intervalu (ako staviš 3000ms, poziva se na svake tri sekunde).
Stephanos ::Druze, nisam stigao do dela kada se koristi " ===" , ali predpostavljam da zamenjuje i<image.length-1, druga mogucnost za koju mislim je ta da images i dalje ima vecu cifru od "if" dodavsi images[i++]Uh, uh, nemoj da pretpostavljaš molim te. Kako bre = može da zamenjuje <? Okej, da, === je takođe relacioni operator, i neki uslovi zapisani upotrebom operatora < mogu da se napišu uz pomoć == (ili === u ovom slučaju), ali to nikako nisu potpuno ekvivalentni uslovi.
A ovaj drugi deo je skroz nerazumljiv. Kako "if" može da ima cifru? Praviš li razliku između cifre (engl. digit) i broja (engl. number)?
|
|
|
|
Poslao: 28 Jan 2018 22:53
|
offline
- Stephanos
- Zaslužni građanin
- Pridružio: 03 Feb 2015
- Poruke: 501
|
vasa.93 ::Predata funkcija ne radi non stop, već se samo poziva u zadatom intervalu (ako staviš 3000ms, poziva se na svake tri sekunde).
Hocu da kazem da setInterval omogucuje pozvanoj funkciji da se ponavalja na svakih 3 sekundi.
vasa.93 ::Uh, uh, nemoj da pretpostavljaš molim te. Kako bre = može da zamenjuje <?
Predpostavljao sam, posto = i == nije isto, to su dve razlicite stvari koje razlicito uticu na kod, medjutim kad sam video === pomislih da je to nesto potpuno drugacije.
vasa.93 ::A ovaj drugi deo je skroz nerazumljiv. Kako "if" može da ima cifru? Praviš li razliku između cifre (engl. digit) i broja (engl. number)?
Opet sam se pogresno izrazio, hteo sam da kazem da ima vecu vrednost. U svakom slucaju, ja sam tek krenuo da ucim, prosao sam 11 video tutorijala sto je jako malo, to su bile neke osnove. Ne postavljaj mi vise takva pitanja, da se ne brukam ovde Znam i da cu za nekoliko meseca da se smejem kada budem citao sta sam pisao ovde.
|
|
|
|
Poslao: 28 Jan 2018 23:06
|
offline
- vasa.93
- Moderator foruma
- Pridružio: 17 Dec 2007
- Poruke: 14824
- Gde živiš: Niš
|
Stephanos ::Hocu da kazem da setInterval omogucuje pozvanoj funkciji da se ponavalja na svakih 3 sekundi.E opet si se loše izrazio. Nije to pozvana funkcija, već prosleđena.
Stephanos ::Predpostavljao sam, posto = i == nije isto, to su dve razlicite stvari koje razlicito uticu na kod, medjutim kad sam video === pomislih da je to nesto potpuno drugacije.Pa kako da nešto vrlo slično bude potpuno drugačije? Elem, == i === imaju sličnu ulogu, osim što je ovo drugo jednako više jednako nego ovo prvo. I bukvalno - === prilikom poređenja uzima u obzir i tipove vrednosti koje se porede, dok == prilikom poređenja vrednosti različitih tipova može da vrši konverzije. Npr. "1" === 1 je false, a "1" == 1 je true.
Stephanos ::Ne postavljaj mi vise takva pitanja, da se ne brukam ovde Znam i da cu za nekoliko meseca da se smejem kada budem citao sta sam pisao ovde. Ma opušteno, ne brukaš se. Svako od nas je nekada bio početnik u nečemu, nema ničeg sramotnog u tome.
|
|
|
|
Poslao: 28 Jan 2018 23:25
|
offline
- Stephanos
- Zaslužni građanin
- Pridružio: 03 Feb 2015
- Poruke: 501
|
Da bi se naucilo i savladalo mora da se ide odpocetka po redu, ja se trudim da ne preskacem gradivo, trenutno pratim tutorijale na srpskom, kada ih pregledam, precicu na tutorijale na engleskom. Sve u svemu mislim da JS i nije toliko komplikovan i tezak, ali za pocetnike jeste. Ti, Elite i Rastafarii koristite neke izraze koje nikad nisam cuo u svetu programiranja, i za mene je to trenutno kao kineski jezik, jer bukvalno nisam ni stigao do tog dela ali me je zanimalo kako da podesim setInterval za ono sto sam ja hteo, sada mogu da nastavim tamo gde sam stao.
|
|
|
|
Poslao: 29 Jan 2018 01:39
|
offline
- Rastafarii
- Moderator foruma
- Pridružio: 22 Mar 2006
- Poruke: 3760
- Gde živiš: 127.0.0.1
|
vasa.93 ::tvoja suština nije bila u tome kada će inkrementiranje da se vrši (isti efekat bi mogao da se postigne i korišćenjem prefiksnog inkrementiranja, ali na drugom mestu), već u tome da ono vraća svoju vrednost koja može da se smesti u indekser i time skrati dodatna linija koja će da radi samo inkrementiranje i da se shodno tome prilagodi uslov i pojednostavi kod.
Jel znas ti Vaso sta je "isto, a nije isto"? Inace, poenta je bila u sve tri stvari - i kad ce inkrementiranje da se izvrsi, i koju vrednost ce da vrati, i skracivanje koda.
@E.L.I.T.E: svaka cast, to je jos krace a ista funkcionalnost
Inace, @Stephanos, "==" je "loose comparison" , odnosno da li leva i desna strana evaluiraju u isto (0 == false ce vratiti true, jer je "0" tzv. false-ish vrednost), dok je "===" mnogo precizniji "strict comparison" koji osim sto proverava vrednost, proverava i tip, pa ce "0 === false" vratiti false, jer je 0 integer, a false boolean tip.
|
|
|
|
Poslao: 29 Jan 2018 15:26
|
offline
- Stephanos
- Zaslužni građanin
- Pridružio: 03 Feb 2015
- Poruke: 501
|
Rastafarii ::
Inace, @Stephanos, "==" je "loose comparison" , odnosno da li leva i desna strana evaluiraju u isto (0 == false ce vratiti true, jer je "0" tzv. false-ish vrednost), dok je "===" mnogo precizniji "strict comparison" koji osim sto proverava vrednost, proverava i tip, pa ce "0 === false" vratiti false, jer je 0 integer, a false boolean tip.
Docicu ja i do tog dela, pa kad naucim, mocicu da vam upadam u tu vrstu konverzacije
|
|
|
|
Poslao: 29 Jan 2018 18:09
|
offline
- E.L.I.T.E.
- Legendarni građanin
- Pridružio: 23 Maj 2012
- Poruke: 4575
|
@Stephanos, na ovo što ću sada da napišem ne trebaš (mada možeš) da obraćaš pažnju trenutno, ali imaj ga u vidu u budućnosti
vasa.93 ::(ako staviš 3000ms, poziva se na svake tri sekunde)
Mala digresija; ovo što si rekao je tačno u teoriji, ali ne mora da bude u praksi (i u većini slučajeva nije, bar kada se radi o većim projektima).
Ovo je pojednostavljena skica standardnog JavaScript okruženja;
Stack služi za praćenje toka izvršavanja JavaScript koda. Ispod je mali primer; definisane su tri funkcije (pomnozi, kvadriraj i ispisiKvadratOd). Uzećemo da je stack na početku prazan (ne znam da li globalan okvir takođe ulazi u njega, no to sada nije ni bitno za ovaj primer). ispisiKvadratOd funkcija je pozvana zajedno sa argumentom 4 i kreira se novi okvir (okvir funkcije koja se trenutno izvršava) u stack-u. Unutar nje pozivamo funkciju kvadriraj sa istim argumentom koja treba da vrati vrednost za ispisivanje i dodajemo je u stack. Da bi kvadriraj vratila vrednost, poziva funkciju mnozenje sa dvaput prosleđenim istim argumentom.
U funkciji pomnozi, vraćamo vrednost 16 (n * n = 4 * 4). Vraćanjem vrednosti završava se izvršavanje funkcije pomnozi pa se ona uklanja sa stack-a, a nastavlja se izvršavanje funkcija kvadriraj. Vrednost 16 se vraća funkciji ispisiKvadratOd, a funkcija kvadriraj se uklanja sa stack-a. Promenljiva kvadrat dobija vrednost 16, a console.log funkcija sa tom vrednošću se dodaje na stack. Nakon ispisa, funkcija console.log se uklanja sa stack-a. Kraj funkcije ispisiKvadratOd implicira da se ista može ukloniti sa stack-a i na kraju on opet ostaje prazan. Prikaz stanja stack-a korak po korak;
+----------------------+ +----------------------+ +----------------------+
| | | | | |
| | | | | |
| | | | | |
| | | | | kvadriraj(4) |
| | | ispisiKvadratOd(4) | | ispisiKvadratOd(4) |
+----------------------+ +----------------------+ +----------------------+
+----------------------+ +----------------------+ +----------------------+
| | | | | |
| | | | | |
| pomnozi(4, 4) | | | | |
| kvadriraj(4) | | kvadriraj(4) | | |
| ispisiKvadratOd(4) | | ispisiKvadratOd(4) | | ispisiKvadratOd(4) |
+----------------------+ +----------------------+ +----------------------+
+----------------------+ +----------------------+ +----------------------+
| | | | | |
| | | | | |
| | | | | |
| console.log(kvadrat) | | | | |
| ispisiKvadratOd(4) | | ispisiKvadratOd(4) | | |
+----------------------+ +----------------------+ +----------------------+
Da bi dokazao ovo umesto vraćanja vrednosti u funkciji pomnozi vratiću exception koji će automatski zaustaviti izvršavanje koda i ispisati trenutno stanje stack-a (tzv. stack trace).
Heap je deo za alokaciju memorije. U C-u recimo koristimo funkcije malloc() i free() za rad sa memorijom, no kod JavaScript-a i većine jezika danas ovaj proces se odrađuje automatski preko sakupljača đubreta (garbage collector) koji alocira potrebnu memoriju i uklanja je nakon što podaci koje sadrži više nisu potrebni.
Sada dolazimo do interesantnog dela. JavaScript okruženja obično koriste jednu nit za izvršavanje koda što znači da možemo da radimo samo jednu stvar u isto vreme, što nije slučaj kod jezika poput Jave koji podržavaju višenitnost. Kako je onda moguće da se kod zaista izvršava nakon određenog vremena? Razlog je queue.
setInterval() je asinhrona funkcija, što znači da joj prosleđujemo callback funkciju koja će biti pozvana nakon završetka određenog zadatka, dok će se dalji tok programa nastaviti za to vreme. Dakle, nakon pozivanja setInterval(), API unutar pregledača kreira brojač koji nakon svakih odbrojanih x milisekundi izvršava određenu funkciju. Zapravo, tako bi trebalo da je u teoriji. Pošto pričamo o okruženjima koja nisu višenitna, funkcija se ne izvršava odmah, već se šalje u queue. U njemu ostaje sve dok se stack ne isprazni. Nakon što se stack isprazni, ona se ubacuje u stack i izvršava.
Jedan praktičan primer za ovo što sam rekao bi bila setTimeout() funkcija podešena na 0 milisekundi. U teoriji bi trebala da bude pozvana odmah, no kao što možemo videti iz priloženog, to nije slučaj (upravo iz razloga koji sam opisao gore). Ona se nakon 0 milisekundi prebacuje u queue, ali se izvršava tek nakon što se stack isprazni.
Takođe, renderovanje se izvršava kada je stack ispražnjen (zbog toga recimo nije moguće raditi bilo šta na stranici nakon pozivanja alert() funkcije sve dok je dijalog otvoren).
|
|
|
|
|