[ Branko Braco @ 10.11.2010. 02:02 ] @
Da li je ikako moguce u javascriptu napraviti pokazivac na funkciju?
[ MilosDj @ 11.11.2010. 23:02 ] @
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




[ Branko Braco @ 12.11.2010. 01:22 ] @
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


[ MilosDj @ 12.11.2010. 15:38 ] @
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]
[ Branko Braco @ 12.11.2010. 17:59 ] @
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") );
[ MilosDj @ 12.11.2010. 19:31 ] @
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.
[ Branko Braco @ 12.11.2010. 19:48 ] @
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
[ Aleksandar Ružičić @ 12.11.2010. 22:35 ] @
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
[ MilosDj @ 12.11.2010. 23:30 ] @
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.
[ misk0 @ 13.11.2010. 18:47 ] @
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

 
[ MilosDj @ 13.11.2010. 22:41 ] @
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.
[ Aleksandar Ružičić @ 13.11.2010. 22:48 ] @
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 :)
[ MilosDj @ 13.11.2010. 23:17 ] @
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.
[ Aleksandar Ružičić @ 14.11.2010. 00:08 ] @
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; };
 
[ MilosDj @ 14.11.2010. 00:29 ] @
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!
[ MilosDj @ 22.11.2010. 17:12 ] @
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.
[ MilosDj @ 22.11.2010. 17:49 ] @
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?
[ vatri @ 23.11.2010. 07:20 ] @
Hvala za ovaj predzadnji post, ovo moze biti korisno.
[ Branko Braco @ 28.12.2010. 13:11 ] @
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.
[ MilosDj @ 29.12.2010. 20:25 ] @
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.
[ Branko Braco @ 29.12.2010. 20:37 ] @
A vidio da u firofoxu 4 ima dosta funkcija koje se koriste u prototype frameworku izmedju ostalog i bind.
samo to if (Function.prototype.bind == null) mi je malo nejasno kako moze biti ispravno, posto ako nema bind funkcije rezultat je undefined a ne null.
[ MilosDj @ 29.12.2010. 20:48 ] @
To radi jer se koristi == a ne ===.

Falsy values:
false
null
undefined
'' || "" // empty string
0
NaN


Trythy values:
all others including strings "false" "0"

Sto znaci da je ispravno napisati false == 0 (result: true)
Ali ovo nije tacno false === 0 (result: false)

== proverava samo vrednost
=== proverava vrednost i tip


[ Branko Braco @ 29.12.2010. 21:04 ] @
A da to sam previdio.
Ali zato ja volim to resavat na sledeci nacin if(!nesto) nekako mi lepse nego == null ili false ili undefined a i krace, uglavnom ova tema me iskreno malo prosvetlila, naucio sam par stvari koje nisam znao, izmedju ostalog apply i call i da mogu koristiti native funkcije u nekim stvarima gdje mi trebaju a nisu predvidjene za to, kao sto je primjer u bind funkciji gde se poziva native funkcija slice bez niza ispred Array.prototype.slice