Avatar billede chrisbuchholz Nybegynder
31. januar 2009 - 11:38 Der er 15 kommentarer og
1 løsning

hvorfor er this relativt til henviseren og ikke barnets forældre?

Hej,

jeg har en klasse som gør en ting og så en anden, og til de forskellige opgaver bruger jeg selvfølgelig this-keyworded. Jeg er dog stødt på to tilfælde hvor parseren bliver nærmere forvirret og tror this er en henvisning til noget andet end det faktisk er.

hvis jeg i klassen har en funktion a og en funktion b, og jeg så f.eks. siger:

setInterval( "this.b()", 5000 );

når b-funktionen så bliver kørt, og jeg bruger this.x (i b funktionen), så tror parseren at this er en henvisning til setInterval-løbet og ikke til min klasse.
Det samme sker med min xmlrequest funktion, men det løste jeg ved at lave en delegator, men da det jo er hardcoded så er det ikke så smart.
Her er delegatoren:

function delegator( responseText ) {
    updates.process( responseText );
}

Hvor updates er en instans er min klasse og responseText tekst er outputtet fra mit xmlrequest.
Det ville dog være smartere hvis jeg bare kunne have en funktionen i klassen som blev kaldt når xmlrequesten var modtaget og jeg så derfra kunne gøre "this.process( responseText )", men der taber parseren også track af this.

Er der noget jeg gør forkert eller har glemt, eller er det virkeligt bare javascript som er dum?
Avatar billede chrisbuchholz Nybegynder
31. januar 2009 - 11:51 #1
Lidt nemmere forklart:

function hehe() {
this.tekst = "hej hej";
}

hehe.prototype.aF = function() {
alert(this.tekst);
}

hvis jeg så kører følgende:

var instance = new hehe();
instance.aF();

Så vil den alerte "hehe", men hvis jeg derimod gør følgende:

function bjarne() {
instance.aF();
}

så vil instance.aF() prøve at alerte bjarne.tekst i stedet for hvad den faktisk skal alerte (instance.aF())
Ja det er ihvertfald det jeg er kommet frem til.
Avatar billede chrisbuchholz Nybegynder
31. januar 2009 - 11:53 #2
i stedet for hvad den faktisk skal alerte :: instance.tekst;

RETTELSE^^
Avatar billede chrisbuchholz Nybegynder
31. januar 2009 - 15:46 #3
Anyone?
Avatar billede olebole Juniormester
31. januar 2009 - 16:47 #4
<ole>

Din forklaring i (31/01-2009 11:51:04) hænger ikke sammen  =)

Løsningen på setInterval-problemet i dit spørgsmål er:
    var me = this;
    setInterval(function(){me.b()}, 5000);

/mvh
</bole>
Avatar billede olebole Juniormester
31. januar 2009 - 16:52 #5
At forstå, hvor this peger hen i forskellige situationer, kræver en ret god forståelse af JavaScript/DOM programmering - og ikke mindst objektorienteret programmering.
Jeg har faktisk en artikel om emnet parat i forbindelse med en længe planlagt (re)lancering af www.dengodekode.dk, men arbejde har desværre (længe) stået lidt i vejen for færdiggørelsen  =)
Avatar billede chrisbuchholz Nybegynder
31. januar 2009 - 17:32 #6
Forstår jeg dig ret når jeg siger at artiklen ikke er lagt op endnu? For jeg kan ikke finde den derinde, ihvertfald.

I midlertidigt - kan du så forklare mig hvordan jeg fikser mit problem så jeg kan komme videre?
Avatar billede chrisbuchholz Nybegynder
31. januar 2009 - 17:34 #7
Oh, havde ikke set din kommentar <31/01-2009 16:47:33>
Avatar billede olebole Juniormester
31. januar 2009 - 18:01 #8
Nej, artiklen er ikke lagt op endnu  =)
Avatar billede chrisbuchholz Nybegynder
31. januar 2009 - 18:14 #9
Noget nys om hvornår den bliver det?
Jeg har smidt din side på evernote så jeg altid kan finde den. Der er sikkert en masse ting jeg kan lære fra en så erfaren mand, nu når jeg selv er ved at gå ind i branchen på professionel plan.
Avatar billede olebole Juniormester
31. januar 2009 - 19:59 #10
I løbet af foråret ... forhåbentlig. Jeg tillader mig at lægge et svar, dersom jeg løste problemet  =)
Avatar billede chrisbuchholz Nybegynder
31. januar 2009 - 20:49 #11
Tak for hjælpen;)
Avatar billede olebole Juniormester
31. januar 2009 - 21:18 #12
Selvtak og tak for points  =)
Avatar billede chrisbuchholz Nybegynder
31. januar 2009 - 21:22 #13
olebole, kunne du fortælle mig om der er en anden måde at gøre det på, end at gemme this i en variabel og så kalde variablen i stedet for this?
Avatar billede olebole Juniormester
04. februar 2009 - 12:40 #14
Det måden at gøre det på. Der er tale et closure objekt, hvorfor du er nødt til at oprette en variabel med en reference til det objekt, this pegede på, da den pågældende closure blev oprettet
Avatar billede chrisbuchholz Nybegynder
04. februar 2009 - 12:49 #15
Okay - det er godt at være. Tak, Olebole
Avatar billede olebole Juniormester
04. februar 2009 - 13:05 #16
Selvtak  =)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester