Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

pokazivac na funkciju???

[es] :: Javascript i AJAX :: pokazivac na funkciju???

Strane: 1 2

[ Pregleda: 5296 | Odgovora: 22 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Branko Braco

Član broj: 44888
Poruke: 43
*.adsl.net.t-com.hr.



+1 Profil

icon pokazivac na funkciju???10.11.2010. u 02:02 - pre 162 meseci
Da li je ikako moguce u javascriptu napraviti pokazivac na funkciju?
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
*.dynamic.isp.telekom.rs.



+4 Profil

icon Re: pokazivac na funkciju???11.11.2010. u 23:02 - pre 162 meseci
JavaScript je funkcionalni jezik! Sustinski je drugaciji od Jave ili C++!

Hteo sam recima da ti objasnim, ali mislim da ce code mnogo bolje ispricati svoju pricu:
Code:
var a = function (str) {alert (str);};    // ; obavezan posle anonimne funkcije!
var b = a;

function ime (str) {alert ('ime '+str);}
var c = ime;    // dodela je bez ()

alert("a: " + typeof (a));    // function
alert("b: " + typeof (b));    // function
alert("c: " + typeof (c));    // function

a("aaa");    // aaa
b("bbb");    // bbb
c("ccc");    // ime ccc
ime("ddd");    // ime ddd





I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

Branko Braco

Član broj: 44888
Poruke: 43
*.adsl.net.t-com.hr.



+1 Profil

icon Re: pokazivac na funkciju???12.11.2010. u 01:22 - pre 162 meseci
Pozdrav Milose, hvala na trudu ali to znam i sam i nije to to sto sam pitao.
Ja znam da u javascriptu ne postoje pokazivaci ali sam mislio mozda postoji neki trik da je neko smislio :)
Vidi brate ti sa ovim primjerom nisi napravio pokazivac niti referencu na funkciju nego njezinu kopiju a to mi ne igra nikakvu ulogu.

primjer za dokaz:
Code:

var obj =
{
  a:5,
  b:function()
  {
     alert(this.a);
  }
}

obj.b(); // 5

var c = obj.b;

c(); // undefined


 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
*.dynamic.isp.telekom.rs.



+4 Profil

icon Re: pokazivac na funkciju???12.11.2010. u 15:38 - pre 162 meseci
Hmh, hvala tebi sto si postavio pitanje. Tek sad vidim da se funkcije prenose by value!
Code:
var a = function (str) {alert (str);};
var b = a;

a('a');    // a
b('b');    // b

a = function ime (str) {alert ('ime: '+str);}
a('a');    // ime: a
b('b');    // b  <--- a ti zelis da prikaze ime: b

Sad sam i ja zainteresovan da cujem da li je moguce to sto zelis

Takodje me zanima zasto i kako alert vidi obj.b? A obicna dodela ne radi.
Code:
alert(obj.b);        // function(){alert(this.a);}
alert(typeof(obj.b));    // function
var c = obj.b;             // unefined


Da li alert(obj.b); koristi obj.b.toString(); ?

[Ovu poruku je menjao MilosDj dana 12.11.2010. u 17:27 GMT+1]
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

Branko Braco

Član broj: 44888
Poruke: 43
*.adsl.net.t-com.hr.



+1 Profil

icon Re: pokazivac na funkciju???12.11.2010. u 17:59 - pre 162 meseci
Da i u tome i jeste problem.
Kada pridruzujes nekoj promenjivoj neku funkciju ta funkcija se prekopira u promenjivu bukvalno od slova do slova.
ali ni to ne bio bio toliko strasan problem jer ajd pokusat cu na razne nacine da izbjegnem da uopste smjestam neku funkciju u novu promenjivu.
Ali problem je kad hocu da ta funkcija se poziva iz nekog dogadjaja a to vec ne mogu da izbjegnem nikako.

Primjer:
Code:


var draggable =
{
   lastX:0,
   lastY:0,
   add:function(obj)
   {
       obj.onmousedown = this.mousedown; // pravi jbn kopiju umjesto da pokazuje na funkciju koju treba
   },
   mousedown:function(e)
   {
      this.lastX = e.clientX; // i ovo nece da zbog toga da radi
      this.lastY = e.clientY; // takodje ni ovo
   }
}

draggable.add( document.getElementById("elementKojiHocuDaDrndamTamoAmo") );
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
*.dynamic.isp.telekom.rs.



+4 Profil

icon Re: pokazivac na funkciju???12.11.2010. u 19:31 - pre 162 meseci
Eeeeeeeee! Mislim da je problem u this.
Citat:
this keyword always refers to the “owner” of a function!
Or rather, to the object that a function is a method of.
this is never null or undefined. it always defaults back to pointing at global object (in browsers this would be the window object).
In the case of event handlers it is very useful if this refers to the HTML element the event is handled by, so that you have easy access to it.

U tvom slucaju this == obj; odnosno html elem koji si mu dodelio. A taj html elem nema lastX i lastY.
p.s.(ako sam pogresio negde, slobodno me ispravite. ja i dalje ucim JavaScript)

Aleksandar je ovde dao lep primer za bind.

Ali i dalje me zanima da li JS ima prave pointere ili ne.
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

Branko Braco

Član broj: 44888
Poruke: 43
*.adsl.net.t-com.hr.



+1 Profil

icon Re: pokazivac na funkciju???12.11.2010. u 19:48 - pre 162 meseci
Znam ja da je u mom slucaju this = obj, ali to se desava zato sto je funkcija draggable.mousedown preslikana u obj umjesto da pokazuje na tu funkciju.
Onaj primjer za bind sto si mi naveo cu sutra da pogledam, sad trenutno mi mozak radi na leru i nije sposoban da razmislja nikako :D
 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Re: pokazivac na funkciju???12.11.2010. u 22:35 - pre 162 meseci
u js-u se svi objekti prenose po referenci a kako su funkcije first-class objekti (tj i funkcija je objekat) i one se prenose (dodeljuju) po referenci, nema nikakvog kopiranja.
ono sto vas buni je context u kome se izvrsava funkcija koji se ne "kopira" prilikom dodeljivanja referenci.

ovaj problem se resava bind metodom koju je Milos linkovao u svom poslednjem postu
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
*.dynamic.isp.telekom.rs.



+4 Profil

icon Re: pokazivac na funkciju???12.11.2010. u 23:30 - pre 162 meseci
Lepo je cuti reci coveka koji zna

Moze malo pojasnjenje za ovo?
Code:
1. var a = function (str) {alert (str);};
2. var b = a;
3.
4. a('a');    // a
5. b('b');    // b
6. 
7. a = function ime (str) {alert ('ime: '+str);}
8. a('a');    // ime: a
9. b('b');    // b  <--- a ti zelis da prikaze ime: b

Ja sam izgooglao da se desava sledece:

1. a postaje pointer na function koji je upravo napravljen na heap-u.
2. b postaje pointer na function koji je ranije(korak 1) napravljen na heap-u.
b nije pointer na a!!!

4. a poziva f sa heapa na koju pointuje
5. isto kao 4.

7. a postaje pointer NOVE funkcije koja se upravo pravi na heap-u.
heap sada ima DVE anonimne funkcije!
8. a pointuje na novu f
9. b pointuje na staru f

Da li sam ovo dobro razumeo?
Ako jesam, da li je moguce menjati te pointere?
Da li je moguce napraviti da b pointuje na a umesto na heap-f?

Da li je moguce overwrite f? U smislu da ne pravim novu f na heap-u nego da zauzmem mesto(pointer) od stare?
Ili je to logicki nemoguce?! Kao kad bih imao function ime(){ljljlj;} i onda kasnije function ime(){njnjnj;} sto nije dozvoljeno.

I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

misk0
.: Lugano :. _.: CH :.

SuperModerator
Član broj: 634
Poruke: 2824
*.adsl.ticino.com.

ICQ: 46802502


+49 Profil

icon Re: pokazivac na funkciju???13.11.2010. u 18:47 - pre 162 meseci
Za to se mogu koristiti closures u JS-u. Ovako

Code (javascript):

var a = function() {console.log("1")};
var b = function() {return a()};

a(); // 1
b(); // 1

a = function() {console.log("2")};
a(); // 2
b(); // 2

 

:: Nemoj se svadjati sa budalom, ljudi cesto nece primjetiti razliku ::
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
*.dynamic.isp.telekom.rs.



+4 Profil

icon Re: pokazivac na funkciju???13.11.2010. u 22:41 - pre 162 meseci
F koja vraca rezultat druge f. Ok, lepo za znati!

Da li sam dobro shvatio sta se desava s funkcijama, dodeljivanjem adresa i sl? Ne bih da sitnicarim ali prilicno mi je vazno da imam ispravan model. Jedino tako mogu slobodno da kombinujem i planiram.
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Re: pokazivac na funkciju???13.11.2010. u 22:48 - pre 162 meseci
prvo: js nema pointere, vec reference. sto je sustinski ista stvar ali ako dolazis iz jezika kao sto je c++ onda volis da pravis tu razliku :)

Citat:
MilosDj:
Da li sam ovo dobro razumeo?
Ako jesam, da li je moguce menjati te pointere?
Da li je moguce napraviti da b pointuje na a umesto na heap-f?


referenca uvek pokazuje na neki objekat, ne mozes napraviti referencu na referencu (dok mozes pointer na pointer, u jezicima koji imaju pointere u pravom smislu te reci - pokazuju na adresu u memoriji)

da bi se postiglo to sto hoces koristis closure, bas kao sto je misk0 napisao.

u njegovom primeru b je referenca na funkciju koja poziva funkciju koju referencira promenljivom a, tako da kada promenis na sta pokazuje a (ali to mora da bude "isto" a, tj da je u istom scope-u) menjas i funkciju koju poziva funkcija na koju pokazuje b.

htredoh malo da pojasnim ali izgleda da sam samo zakomplikovao ovom predhodnom recenicom :)
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
*.dynamic.isp.telekom.rs.



+4 Profil

icon Re: pokazivac na funkciju???13.11.2010. u 23:17 - pre 162 meseci
Citat:
Aleksandar Ružičić: prvo: js nema pointere, vec reference. sto je sustinski ista stvar ali ako dolazis iz jezika kao sto je c++ onda volis da pravis tu razliku

referenca uvek pokazuje na neki objekat, ne mozes napraviti referencu na referencu (dok mozes pointer na pointer, u jezicima koji imaju pointere u pravom smislu te reci - pokazuju na adresu u memoriji)

TO LAVE!!! Tako mi reci JS nema pointere! Let the light come
Da, imam C++ u glavi i kad neko kaze pointer onda je to zaista pointer i nista vise!
32/64bit mem adresa koja kao vrednost ima 32/64bit mem adresu. Mogu da ih chainujem kako god hocu.
Na netu stalno citam o JS pointerima. U knjizi pointeri. Neki primer sa komentarom: // pointer to function.
Ocigledno je sve to veoooma pogresno!

Ako JS nema pointere onda ne mogu ni da ih menjam, tj. ne mogu nista da radim s njima.
Nema reference na referencu - takodje vazno.
Predpostavljam da mogu da napravim referencu samo i jedino na objekat. JS nema *(pointer) ili &(reference) operator.
= se koristi i za by value i za by reference. Zato su i pricali da se primitive dodeljuju samo by value.
Hmh, tad to nisam shvatio...


Citat:
htredoh malo da pojasnim ali izgleda da sam samo zakomplikovao ovom predhodnom recenicom
Njet, sve mi postaje mnogo jasnije.Da je napisao a = 4; b bi vratilo 4

Hvala svima na odgovorima. I OP- na postavljenom pitanju. Jako mi je vazno da sve ovo lepo razumem.

I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Re: pokazivac na funkciju???14.11.2010. u 00:08 - pre 162 meseci
Citat:
MilosDj: Njet, sve mi postaje mnogo jasnije.Da je napisao a = 4; b bi vratilo 4 :D


Nope, dobio bi TypeError, jer "funkcija" b izgleda ovako:
Code (javascript):

var b = function() {return a()};
 


dakle gledano semanticki imamo identifier a i operator (), iliti u objektno orijentisanom smislu imamo objekat a kome saljemo poruku ().

kada je objekat a tipa Function on razume poruku koju mu saljemo ("call function") i obradice je uspesno.

sa druge strane, kada a nema pojma sta znaci ta poruka, kao sto je u slucaju kada je a = 4 (tj kada je tipa Number) doibces runtime error.

jos jedna bitna stvar kod javascripta je da je u pitanju typeless jezik tj da je type system dinamican (ili je mozda ipak blize reci da je "duck typing" sistem u pitanju) tako da promenljiva nije vezana za jedan tip koji moze da predstavi.

ali zahvaljujuci izrazajnosti javascripta moguce je dobiti to sto hoces, ali onda bi funkcija na koju pokazuje b izgledala ovako:
Code (javascript):

var b = function() {return a instanceof Function ? a() : a; };
 

 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
*.dynamic.isp.telekom.rs.



+4 Profil

icon Re: pokazivac na funkciju???14.11.2010. u 00:29 - pre 162 meseci
Daaaaaaaaaa! Kako je lako prevideti () Video sam ih ocima, ali nisam shvatio da ce one ostaju iza a! Mogao je tu i neki parametar da se pojavi. 4(param) tek tad ne bi znala sta da radi s tim

U mom slucaju bi to ovako izgledalo: var b = function() {return 4();}


var b = function() {return a instanceof Function ? a() : a; };Skidam kapu!
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
*.dynamic.isp.telekom.rs.



+4 Profil

icon Re: pokazivac na funkciju???22.11.2010. u 17:12 - pre 162 meseci
Code:
var obj =
{
  a:5,
  b:function()
  {
     alert(this.a);
  }
}

obj.b(); // 5

var c = obj.b;
alert(typeof(c));    // function
c(); // undefined; this.a = undefined; window.a = undefined; 

a = 'njnjnj';   // ili window.a='nesto';
c();      // njnjnj zato sto this u funkciji b refers to window tj.global


function bind(obj, method) {
  return function () { return method.apply(obj, arguments); }
}

var d = bind(obj,obj.b);
d();     // 5

Ovo sam dodao kao pojasnjenje sebi i ljudima koji uce.
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
*.dynamic.isp.telekom.rs.



+4 Profil

icon Re: pokazivac na funkciju???22.11.2010. u 17:49 - pre 162 meseci
Ovo objasnjenje kako rade funkcije mi je pomoglo da shvatim kako i zasto radi John-ov ninja primer 14
Cak i primer 13 lepo radi ako se ukine problematican 'ninja.yell' rekurzivni poziv!



Iz primera 14 ninja i samurai referencuju na funkciju yell negde u memoriji.
I posto funkcija yell ima ime, ona moze da poziva samu sebe.
Brisanje objekta ninja ce reci garbage collectoru sta je sve predvidjeno za brisanje. Ali f yell nece biti obrisana sve dok je neko koristi. U ovom slucaju samurai.

Primer 13 je malo tezi za razumevanje jer je greska u 'pogresanom' pozivu za rekurziju.
samurai.yell i dalje lepo referencira na anonimnu f u memoriji. jedino sto anonimna f nije u stanju da pozove samu sebe jer je obrisan ninja objekat. Koji je nesrecno hard coded kao rekurzivni poziv.
Kad se ukine rekurzija, samurai.yell lepo radi.

U oba slucaja, objekti dele/referencuju istu funkciju. U oba slucaja funkcija nije obrisana dokle god postoji neki objekat koji je koristi.

Moje pitanje (mozda za novu temu) je da li sam dobro shvatio kako se prave i brisu objekti? Ima l' tu jos nesto zanimljivo?
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

vatri
Banja Luka, RS

Član broj: 68697
Poruke: 1006
*.static.stelkom.net.



+18 Profil

icon Re: pokazivac na funkciju???23.11.2010. u 07:20 - pre 162 meseci
Hvala za ovaj predzadnji post, ovo moze biti korisno.
 
Odgovor na temu

Branko Braco

Član broj: 44888
Poruke: 43
*.adsl.net.t-com.hr.



+1 Profil

icon Re: pokazivac na funkciju???28.12.2010. u 13:11 - pre 161 meseci
Znam da je proslo dosta vremena ali jbg, moram se zahvaliti Milosu i Aleksandru na odgovorima, bind funkcija mi je olaksala dosta zivot i sad vise stvarno ne znam kako sam mogao pre bez nje :)
Znaci pomogli ste mi jako puno i veliko hvala obadvojci.
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
*.dynamic.isp.telekom.rs.



+4 Profil

icon Re: pokazivac na funkciju???29.12.2010. u 20:25 - pre 161 meseci
No prob :)
Meni je odgovaranje na tvoje pitanje pomoglo da shvatim kako JS engine barata s funkcijama.

I gledaj da uvek stavljas if (Function.prototype.bind == null) {...} jer ide HTML5 koji dobija JS engine sa svojom mnogo brzom bind funkcijom.
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

[es] :: Javascript i AJAX :: pokazivac na funkciju???

Strane: 1 2

[ Pregleda: 5296 | Odgovora: 22 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.