[info] O FP8,9 AS2/3 Garbage Collector-u, interesantne stvari o kojima nisam razmisljao |
Dobrodošli, goste ( Prijava | Registracija )
![]() ![]() |
[info] O FP8,9 AS2/3 Garbage Collector-u, interesantne stvari o kojima nisam razmisljao |
Nov 5 2007, 18:31
Poruka
#21
|
|
|
određeni član Grupa: Urednici Poruke: 2,628 Datum reg.: 6-February 05 Lokacija: orion Član broj: 227 |
nema "mog" i "tvog/vašeg" načina... mislio sam na konkretan primer u kome xml deklarišeš u anonimnoj funkciji kratkog veka, pa to uporedio sa mojom navikom da xml čuvam kao "oko u glavi".
pri tome ne umanjujem vrednost forx-a već mu u konkretnoj situaciji ne nalazim primenu, jer mi i treba predvidljivo konstantna šetnja od roditelja ka detetu i nazad. što se pokušaja upotrebe forx-a tiče, problem je pravila getMultiNodes metoda. nema šanse da se setim konkretne situacije ali nisam dobijao planirani rezultat. na kraju je bilo jednostavnije napisati dve linije "izokola" koda nego vijati modus koji šljaka. usput, za konkretan primer mi je trebao "xml operativni" podskup nodova istog roditelja, a niz takvih nodova koje bih dobio sa getMultiNodes bih morao ponovo da konvertujem u xml. konkretno sam na to mislio kada sam spomenuo moj/tvoj način... ja bih, operišući već sa xml-om, očekivao da mi funkcija vrati xml a ne array. anyway, forx je odličan za komunikaciju, ali ja xml uglavnom koristim za definiciju linijskog kretanja po strukturi... |
|
|
|
Nov 5 2007, 19:59
Poruka
#22
|
|
|
^ Ok, jasno, nisi to lepo formulisao u startu.
U pravu si sto se tice getMultiNodes. Ta metoda ne radi ni upola onoga sto bih ja zeleo da radi. Howeva, getMultiNodes je ubacen tek u poslednjoj minor verziji 0.7 i ubacio sam je bukvalno kao extended varijantu getPathNode-a. Ima jos puno da se radi na tome. Zato mi je i potreban feedback, upravo od ljudi kao sto ste ti i MrSteel, zato sto radite sa XMLom onako kako sam zamislio sopstvenu ciljnu grupu. Ideja je da stvorim alat koji ne radi na moj nacin, nego je univerzalan i dovoljno dobar i za moju, i tvoju i MrSteelovu implementaciju. Tek tada cu biti zadovoljan. U sustini, kako sada stvari stoje, ForX je 60-70% potrazivanje, 30-40% kreiranje i manipulacija XMLom. Postoji nacin da se jednostavno izvede to sto ti je trebalo, ali je kroz workaround. getMultiNodes radi identicno getPathNode-u. Jedina razlika izmedju ova dva je u tome sto getPathNode vraca samo onaj nod koji se uklapa u query, a getMultiNodes vraca niz svih nodova koji se uklapaju u query. Prednost vracanja niza je u tome sto metoda nije destruktivna, vec ti daje reference na nodove, cime ti je i dalje dostupna originalna struktura XMLa kroz sam rezultat. Evo jedne interesantne primene getMultiNodes: CODE <ImageFolder> <Image id="4" type="public" thumb="thumbs/campus_winter_nature.jpg">Winter Campus</Image> <Image id="11" type="public" thumb="thumbs/scenic_winter4.jpg">Scenic Winter</Image> <Image id="15" type="hidden" thumb="thumbs/Winter_in_raleigh_smaller.jpg">Winter In Raleigh</Image> <Image id="5" type="public" thumb="thumbs/maine-pine-haven-winter-par.jpg">Pine Haven</Image> <Image id="20" type="public" thumb="thumbs/winter-view-photo.jpg">Winter Cottage</Image> <Image id="0" type="hidden" thumb="thumbs/AB5515~Winter-Awakening-Pos.jpg">Winter Awakening</Image> <Image id="3" type="public" thumb="thumbs/branch-snow_winter.jpg">Branch</Image> <Image id="18" type="public" thumb="thumbs/winter-3d-screensaver_1.jpg">Snowy Plains</Image> <Image id="7" type="public" thumb="thumbs/peak_district_winter_avidim.jpg">Peak District</Image> <Image id="8" type="public" thumb="thumbs/rememberwinter1280x1024ls.jpg">Remember Winter</Image> <Description>Winter photos</Description> <Copyright year="2007">Various Artists</Copyright> <Image id="9" type="public" thumb="thumbs/rus-winter.jpg">Russian Winter</Image> <Image id="14" type="hidden" thumb="thumbs/winter_foto_pixelquelleWann.jpg">Winter Beach</Image> <Image id="19" type="hidden" thumb="thumbs/winter-scenes_340.jpg">Arctic Landscape</Image> <Image id="10" type="public" thumb="thumbs/sapporo-winter-3.jpg">Sapporo Winter</Image> <Image id="1" type="public" thumb="thumbs/Batsto_Horse_Barn_Winter_.jpg">Horse Barn</Image> <Image id="2" type="public" thumb="thumbs/black_fruit_in_the_snow.jpg">Black Fruit In The Snow</Image> <Image id="13" type="public" thumb="thumbs/winter.jpg">Winter Night</Image> <Image id="6" type="public" thumb="thumbs/mild-winter-3d-screensaver.jpg">Mild Winter</Image> <Image id="17" type="hidden" thumb="thumbs/winter2_03.jpg">Urban Chill</Image> <Image id="12" type="hidden" thumb="thumbs/winter(2).jpg">White Trees</Image> <Image id="16" type="public" thumb="thumbs/winter2.jpg">Mountain Road</Image> </ImageFolder> CODE import com.orionSyndrome.xml.Forx; class com.orionSyndrome.Stuff { private var __copyright:Object; private var __sDescription:String; private var __xmlImages:XML; private var __images:Array; public function Stuff(sUrl:String) { __loadData(sUrl); } private function __loadData(sUrl:String):Void { var $class = this; __xmlImages = new XML(); __xmlImages.ignoreWhite = true; __xmlImages.onLoad = function(fSuccess:Boolean) { if(fSuccess) { with($class) { var t:Number = getTimer(); __parseCommonInfo(); __parseImages(); trace("Parsing time: " + (getTimer() - t) + " milliseconds"); trace("--"); __dumpStuff(); } delete this; } } __xmlImages.load(sUrl); } private function __parseCommonInfo(Void):Void { var f:Forx = new Forx(__xmlImages); var xnCopy:XMLNode = f.getPathNode("imagefolder.copyright"); __copyright = { year: f.getPathValue("@year", xnCopy), owner: f.getPathValue(null, xnCopy) } __sDescription = f.getPathValue("imagefolder.description"); } private function __parseImages(Void):Void { __images = new Array(); var f:Forx = new Forx(__xmlImages); var nodes:Array = f.getMultiNodes("imagefolder.image?type:public"); var image:Object; for(var iNode:Number = 0; iNode < nodes.length; iNode++) { image = { thumb: f.getPathValue("@thumb", nodes[iNode]), caption: f.getPathValue(null, nodes[iNode]) } __images[Number(f.getPathValue("@id", nodes[iNode]))] = image; } } private function __dumpStuff(Void):Void { trace("Description: '" + __sDescription + "'"); trace("Copyright (c) " + __copyright.year + " by " + __copyright.owner); for(var i:Number = 0; i < __images.length; i++) { trace("Image " + i + ":"); if(__images[i] != undefined) { trace(" caption: '" + __images[i].caption + "'"); trace(" thumb: '" + __images[i].thumb + "'"); } else { trace(" (empty slot)"); } } } } Da, bacio sam XML koji sam ucitao. Medjutim, taj XML je mogao lako biti deo neke vece strukture i mogao je biti samo prosledjen ovoj klasi, bez unistavanja. Primer je mozda malo cudan, ali ne znaci da takav slucaj ne mora da postoji. Stavise, bas sam danas pravio nesto slicno. Namerno sam podelio slike na dva tipa: public i hidden, bez nekog posebnog razloga. Klasa smesta slike u odgovarajuce slotove (prema id-u noda) koji su sortirani na kraju, i usput izbegava hidden slike. Drugim recima, rezultat ima nekolicinu praznih slotova koji su ili definisani prazni (tj. nisu popunjeni u XMLu), ili su sadrzali hidden sliku. Evo kako izgleda rezultat: CODE Parsing time: 7 milliseconds -- Description: 'Winter photos' Copyright © 2007 by Various Artists Image 0: (empty slot) Image 1: caption: 'Horse Barn' thumb: 'thumbs/Batsto_Horse_Barn_Winter_.jpg' Image 2: caption: 'Black Fruit In The Snow' thumb: 'thumbs/black_fruit_in_the_snow.jpg' Image 3: caption: 'Branch' thumb: 'thumbs/branch-snow_winter.jpg' Image 4: caption: 'Winter Campus' thumb: 'thumbs/campus_winter_nature.jpg' Image 5: caption: 'Pine Haven' thumb: 'thumbs/maine-pine-haven-winter-par.jpg' Image 6: caption: 'Mild Winter' thumb: 'thumbs/mild-winter-3d-screensaver.jpg' Image 7: caption: 'Peak District' thumb: 'thumbs/peak_district_winter_avidim.jpg' Image 8: caption: 'Remember Winter' thumb: 'thumbs/rememberwinter1280x1024ls.jpg' Image 9: caption: 'Russian Winter' thumb: 'thumbs/rus-winter.jpg' Image 10: caption: 'Sapporo Winter' thumb: 'thumbs/sapporo-winter-3.jpg' Image 11: caption: 'Scenic Winter' thumb: 'thumbs/scenic_winter4.jpg' Image 12: (empty slot) Image 13: caption: 'Winter Night' thumb: 'thumbs/winter.jpg' Image 14: (empty slot) Image 15: (empty slot) Image 16: caption: 'Mountain Road' thumb: 'thumbs/winter2.jpg' Image 17: (empty slot) Image 18: caption: 'Snowy Plains' thumb: 'thumbs/winter-3d-screensaver_1.jpg' Image 19: (empty slot) Image 20: caption: 'Winter Cottage' thumb: 'thumbs/winter-view-photo.jpg' Kod se moze skinuti ovde (Flash 8). Planiram da napravim getMultiNodes jos kompleksnijim i mocnijim u buducnosti, ali mi je potreban feedback da bih uspeo u tome. |
|
|
|
|
Nov 5 2007, 20:22
Poruka
#23
|
|
|
Hvala puno Syndrome i sve sam razumeo ali delete nisam nikako buni me nesto:
CITAT delete niz; - Ako pokusamo unutar funkcije zavrsiNiz da obrisemo varijablu niz, dobicemo ovo. Unistava se entry ove varijable (odnosno, postaje nedostupna), a zajedno sa njom nestaje i referenca na Array objekat. Medjutim, Array objekat nece biti unisten, zato sto varijabla a iz funkcije odradiStvar i dalje pokazuje na njega. Hoces reci da ako uradis delete niz; unutar funkcije zavrsiNiz(); da tada vise neces moci pristupati referenci variable 'a' (tj objektu Array na kojeg variabla 'a' pokaziva), preko lokalne variable niz , jer lokalna variabla niz vise nece imati referencu na taj isti Array objekat? EDIT: Ovako si mislio: CODE function zavrsiNiz(niz:Array) {
delete niz; //variabla a se nece izbrisati tj objekat Array na kojeg var a pokaziva. niz.push("after delete"); //posle delete niz; ovo vise nece menjati Array objekat na kojeg pokaziva "a" variabla } |
|
|
|
|
Nov 5 2007, 21:36
Poruka
#24
|
|
|
određeni član Grupa: Urednici Poruke: 2,628 Datum reg.: 6-February 05 Lokacija: orion Član broj: 227 |
vi'š ti to... uhvatim se za forx i o'ma za ono što ne radi
nije frka za forx, biće primene... već sam negde napisao da je dušu dao za integraciju sa swfAddress. samo da se raščisti situacija oko toga šljaka li ovaj u ...king adobe playeru. |
|
|
|
Nov 5 2007, 21:43
Poruka
#25
|
|
|
Ovako si mislio: Bas tako. Ako niz ne vidi vise Array objekat, ne moze ni da pridje njegovom interfejsu, a push metoda je deo tog interfejsa.Prakticno, sa delete obrises niz, ali ne obrises ono na sta niz pokazuje. U generalnom slucaju, kada uradis CODE var obj:Object = new Object(); delete obj; ...ne brises objekat, nego varijablu obj. GC brise objekat kada shvati da niko vise ne pokazuje na njega. Isto tako, mozes (i trebalo bi) da shvatis new kao operator koji kreira anonimni objekat i vraca referencu na njega. A posto smo napisali obj = new Object();, ta referenca se dodeljuje varijabli obj. U sustini, to je osnova objektnog programiranja, koju uvek nekako preskocim da kazem kada pricam o tome. Uvek sam mislio da je to previse skolski i dosadno, ali vazno je reci pre ili kasnije da varijabla i objekat nikad ne zavise jedno od drugog. Varijabla je kao prozor, pa cak i kad pokazuje na primitivan podatak (broj, tekst, true/false...), ili nikakav podatak (undefined), ili specijalan podatak (null). Pravi podatak je negde drugde, a sa objektima to samo postaje malo ociglednije. Sreca pa ActionScript nema pointere Sad sa tim saznanjem pokusaj da shvatis sta se desava sa onim primerom u postu #1 @the Pa nije bas da ne radi. Pre bih rekao da si ocekivao nesto drugo... Verovatno. U svakom slucaju bih voleo da znam: ako ne radi, sta ne radi, ako je trebalo da radi nesto drugo, sta je to... I tako to. |
|
|
|
|
Nov 5 2007, 22:13
Poruka
#26
|
|
|
Bas tako. Ako niz ne vidi vise Array objekat, ne moze ni da pridje njegovom interfejsu, a push metoda je deo tog interfejsa. Prakticno, sa delete obrises niz, ali ne obrises ono na sta niz pokazuje. Al nebi se slozio u ovom slucaju da delete brise lokalnu variablu niz. Jer delete ce obrisati lokalnu variablu samo ako je lokalna var dostupna u ovom slucaju nije dostupna, jer niz variabla nije nigde deklarisana u funkciji zavrsiNiz(); jer ona je samo argument u ovom slucaju, argumente nemozemo da brisemo sa delete niti bilo sta da menjamo pomocu operatora delete kad je upitanju argument. Ajmo testirati: CODE odradiStvar();
function odradiStvar() { var a:Array = new Array(); pocniNiz(a); zavrsiNiz(a); trace("prikazi niz i njegove promene: " + a); } function pocniNiz(niz:Array) { for(var i:Number = 0; i < 10; i++) { niz.push(Math.floor(Math.random() * 100)); } } function zavrsiNiz(niz:Array) { delete niz; //pokusaj brisanja lokalne var niz iz scopa ove funkcije niz.push("after delete");//ovo nebi trebalo nakon delete operatora da nemenja referencu variable 'a' tj objekat Array na kojeg ona pokaziva. //znaci nemozemo argumente da brisemo sa delete ili da bilo sta drugo da uradimo sa delete argumentu 'niz' trace(niz); } |
|
|
|
|
Nov 5 2007, 23:13
Poruka
#27
|
|
|
^ Da, ali samo zato sto je zakljucana, a ne zato sto je po bilo cemu specijalna.
Mozda da probas ovako, da vidimo dal' ne moze da se obrise CODE odradiStvar(); function odradiStvar() { var a:Array = new Array(); pocniNiz(a); zavrsiNiz(a); } function pocniNiz(niz:Array) { for(var i:Number = 0; i < 20; i++) { niz.push(Math.floor(Math.random() * 100)); } } function zavrsiNiz(niz:Array) { trace("PRE: " + niz); _global.ASSetPropFlags(niz, null, 0, 0); delete niz; trace("POSLE: " + niz); } Po meni je pogresno sto su argumenti zakljucani (zato sto to daje argumentima tretman koji ne zasluzuju), ali moguce je da postoje neke implikacije koje meni nisu pale na pamet, a Macromediji jesu. U svakom slucaju, gore sam vec pokazao da nema mnogo koristi od brisanja argumenata. Moguce je da su i oni zakljucili isto to, i da su zakljucali argumente upravo zbog toga sto ni sami nisu sigurni da li to moze dovesti do nezeljenih rezultata u nekim situacijama. Status kvo. |
|
|
|
|
Nov 6 2007, 02:08
Poruka
#28
|
|
|
Grupa: Članovi 1 Poruke: 2,670 Datum reg.: 5-February 06 Lokacija: nozomu-tokyo Član broj: 3,250 |
posledica koncepcije,
arguments je tipa Object, |
|
|
|
Nov 6 2007, 02:37
Poruka
#29
|
|
|
Ne verujem da to ima veze sa ovim. Taj arguments objekat pripada generickom prototipu same funkcije. Najobicniji niz koja se kreira po izvrsavanju funkcije, na osnovu onih parametara koji su prosledjeni.
U stvari, uvek sam se pitao, zasto ECMAScript ne podrzava named arguments sintaksu, kada ima sve sastojke za to. Pretpostavljam da je zbog toga sto ni kompajler ni interpreter nisu striktni u tipiziranju. Zbog loose tipizacije su i presli na AS3, jer je postalo pretesko peglati nesto sto nije zamisljeno rigidno, sa sve predefinisanim imenima parametara i jasnim i preciznim deklaracijama. Jer kao sto svi znamo, mozes pozvati funkciju na potpuno deseti nacin od onoga sto je definisano deklaracijom (za razliku od Jave, AS je kao sundjer; mada nikad nisam voleo onaj djavo 'polimorfizam' u Javi -- jedina stvar gora od toga su pointeri u C-u). CITAT (arguments) Note that there may be a different number of arguments passed in than the function declares. Kako god IMHO, nema logike zabraniti izbacivanje objekta iz niza u ovom slucaju koji je pokazao ww. arguments je zamisljen kao user-convenience (da bi mogao da iteriras kroz argumente), i verovatno je usvojen iz Jave koja je pokusala da objektom zameni argc i argv u C-u. To je posledica, pre nego uzrok. Cudna i zanimljiva stvar, u svakom slucaju. |
|
|
|
|
Nov 6 2007, 02:48
Poruka
#30
|
|
|
Grupa: Članovi 1 Poruke: 2,670 Datum reg.: 5-February 06 Lokacija: nozomu-tokyo Član broj: 3,250 |
mislio sam samo na pricu o brisanju argumenata, sasvim je jasno zasto ne mozes obrisati originalnu promenljivu
da baratamo sa pointerima onda bi moglo sve pointer - pokazivac na memorijsko mesto, evo najavili su da ce array biti tipiziran, ECMA4 http://aralbalkan.com/1072 |
|
|
|
Nov 6 2007, 03:25
Poruka
#31
|
|
|
Ima fora kako moze da se extenduje Array u ASu2 (moses je to uradio u Fuse-u; zezao sam se tim da vidim kako radi, ispostavilo se da je tezak workaround, ali stabilan).
Ako te to interesuje, mozemo da se zezamo da probamo da napravimo TypedArray klasu za AS2. Ne bi trebalo da bude toliko tesko. Malo egzibicija nije na odmet |
|
|
|
|
Nov 6 2007, 12:33
Poruka
#32
|
|
|
Da radi radi
Ali ASSetPropFlags mi je poznato tj naisao sam negde na ovo ali u helpu nisam sigurno, ovo je neki hack? Posto vidim da je brisanje argumenata jako skakljivo i po defaultu je zakljucano tako reci, sta onda kazete na undefined, tj u ovom slucaju niz = undefined;? Naravno da necemo lokalnu var niz izbrisati u podpunosti ali cemo ukloniti vrednost koju ona nosi po meni je to onako ok da se nekad uradi ukoliko je upitanju neka lokalna neki argument koji nosi vecu kolicinu informacija? |
|
|
|
|
Nov 6 2007, 13:09
Poruka
#33
|
|
|
Grupa: Članovi 1 Poruke: 2,670 Datum reg.: 5-February 06 Lokacija: nozomu-tokyo Član broj: 3,250 |
bilo bi super imati primer kada je dobro unistavati argumente
ja ne mogu da osetim potrebu za tim, klasa ima svoje promenljive klasa sama unistava svoje promenljive mene cela ova prica nesto posebno ne interesuje zaista interesantniji su mi papervision, koncepti organizacije as projekata i sl. argumenti ne mogu da se obrisu ili bilo sta sa njima posto je argument objekat, koji sadrzi prekopirane argumente u taj arguments objekat koncepcija je takva i stoga sa originalnom promenljivom funkcija nema dodirnih tacaka osim sto je dobila vrednost |
|
|
|
Nov 6 2007, 13:54
Poruka
#34
|
|
|
Da classa ce da unisti svoje promenljive ali tek kada je upotrebis ponovo.
U biti volio bih uvek da pobrisem sve lokalne i globalne(sa globalnim ima resenje) promenljive u svim onim funkcijama koje se upotrebljavaju retko u nekoj aplikaciji, a nose veliku kolicinu informacija, znaci neke funkcije koje barataju sa nizovima ili mozda xml-om itd... Mislim da ima neko elegantno resenje za ovo i mislim da bi bilo od koristi. Mozda syndrome nesto provali A mozda je i undefined jedno od resenja? |
|
|
|
|
Nov 6 2007, 14:30
Poruka
#35
|
|
|
Grupa: Članovi 1 Poruke: 2,670 Datum reg.: 5-February 06 Lokacija: nozomu-tokyo Član broj: 3,250 |
jedno je brisanje lokalnih promenljivih a drugo brisanje parametara funkcije
ja bi to nazvao nekorektnim programiranjem niko ne ocekuje takvo ponasanje od stvari koje bi koristio u radu al ok, budzi sto da ne |
|
|
|
Nov 6 2007, 18:41
Poruka
#36
|
|
|
bilo bi super imati primer kada je dobro unistavati argumente ja ne mogu da osetim potrebu za tim, klasa ima svoje promenljive klasa sama unistava svoje promenljive Potpuno tacno. Kao sto sam vec (tri puta) rekao, ne vidim nikakvu primenu u brisanju argumenata, uglavnom zato sto su kratkog veka i zato sto se podrazumeva da postoji nekakva arhitektura koda kojom se to moze izbeci i pre nego sto dodje do potrebe za tim. @MrSteel Nisi mi odgovorio za TypedArray? Ili jesi? |
|
|
|
|
Nov 6 2007, 19:22
Poruka
#37
|
|
|
Grupa: Članovi 1 Poruke: 2,670 Datum reg.: 5-February 06 Lokacija: nozomu-tokyo Član broj: 3,250 |
jesam, meni ne treba jer je inace AS2 opusteno programiranje tako da jedna stvar koja bi smanjivala mogucnosti za gresku ne bi puno znacila, generalno mi ne treba ali moze da se uradi nije frka
|
|
|
|
Nov 7 2007, 01:36
Poruka
#38
|
|
|
Grupa: Članovi Poruke: 65 Datum reg.: 10-March 06 Lokacija: SA Član broj: 3,715 |
odkako ste poceli pricati o ovome svi su zanijemili,ja ovo nista nemrem skontat al opet zanimljivo vidjet kako se shutate sa tim nizovima,argumentima funkcijama... samo dokle ovako pocinjete da ubijate u ljudima i ono malo samopuzdanja glede znanja o flashu
|
|
|
|
Nov 7 2007, 01:56
Poruka
#39
|
|
|
Znam kako vam je.. Tako se ja osecam svaki dan kad pricamo o preloaderima i smanjivanju zvuka, samo obrnuto.
Tesko je naci modus na ovom forumu. Ponekad se zapitam kako imam strpljenja uopste, pogotovo kada neko krene da proziva i da pravi budale od nas, umesto da nauci nesto. Steta je, posle cete svi vi koji slusate morati da lovite hintove po guglu, umesto da ovakvih tema bude vise pa da svi napredujemo. |
|
|
|
|
Nov 8 2007, 10:45
Poruka
#40
|
|
|
Znam postajem vec extra dosadan al opet mi nije jasno zasto bi drzali duple informacije u memoriji.
Nemoj te se sad ljutiti Syndrome i Steel Pazi ovaj primer, ali ovo vazi samo kod funkcija kod kojih smo unapred deklarisali neku var koja ceka da primi argument. CODE odradiStvar(); function odradiStvar() { var a:Array = new Array("before pocniNIz()"); pocniNiz(a); zavrsiNiz(a); trace("prikazi niz " + a); } function pocniNiz(niz:Array) { trace("ARGUMENTS " + arguments[0]); trace("LOAKL NIZ " + niz); delete arguments[0]; for(var i:Number = 0; i < 10; i++){ niz.push(Math.round(Math.random()*100)); } trace("ARGUMENTS " + arguments[0]); trace("LOAKL NIZ " + niz); } function zavrsiNiz(niz:Array) { trace("ARGUMENTS " + arguments[0]); delete arguments[0]; niz.push("finished"); } Komentarisat cu funkciju zavrsiNiz(); Znaci u funkciji odradiStvar() deklarisali smo varablu 'a' koja pokaziva na objekat Array, prosledili smo je funkciji zavrsiNiz(), u funkciji zavrsiNiz() kako ga ja nazivam u polju za pass parameters smo kreirali lokalnu var 'niz' koja prima referencu variable 'a' tacnije objekat Array na kojeg ona pokazuje, objekat Array je postao argument kojeg je primila variabla 'niz' i od toga trenutka kada je var 'niz' primila argument imamo tako reci dvije stvari koje pune memoriju i u isto vreme pokazuju na isti objekat Array i sa obe stvari mozemo da manipulisemo objekat Array, stim sto su one povezane unutar funkcije zavrsiNiz() tacnije receno kad objekat Array punimo pomocu var niz puni se i arguments[0] jer je niz primila arguments[0] i pokaziva na njega i postala je argument. Znaci od sada imamo var niz koja puni memoriju jer je preuzela ulogu argumenta i plus sam arguments[0] koji takodje puni memoriju, sto znaci da arguments[0] mozemo komotno da izbrisemo iz memorije jer tu ulogu argumenta[0] je preuzela var niz koju smo unapred deklarisali u delu funkcije koju ja zovem area for pass parameters. Ukoliko arguments[0] neobrisemo a nastavimo da manipulisemo var niz recimo sa metodom push() u isto vreme ce se puniti i arguments[0] sto nam je totalno nepotrebno zar ne? Pa zato i jesmo deklarisali var niz koja preuzela ulogu argumenta i koja nam je bitna da znamo sta smo primili i koju vrstu podataka i onda arguments[0] brisemo. Ukoliko nam nije vazno sta primamo koju vrstu podataka, tj ukoliko unapred znamo da ce ta funkcija 100% reicmo primiti array netrebamo ni deklarisati var toga tipa unutar area for pass parameters nego mozemo direktno da radimo sa arguments[0], ili cak jos bolje cim udje u funkciju proveriti ga i posle na kraju kada se sve zavrsi lepo ga obrisati sa delete argumnts[0]. Malo sam spetljano objasnio al verujem da kroz primer znate sta mislis. EDIT: primer da razjasnim: CODE function pocniNiz(niz:Array) {
niz = undefined; for(var i:Number = 0; i < 10; i++){ arguments[0].push(Math.round(Math.random()*100)); } delete arguments[0]; trace("LOAKL NIZ " + niz); trace("ARGUMENTS " + arguments[0]); } |
|
|
|
|
![]() ![]() |
| Lo-fi verzija | Trenutno vreme: Monday 20. May 2013 - 17:56 |