Toon posts:

[JS] Object method als argument in een functie meegeven?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik loop nu al een paar keer tegen dit probleem aan... Heb al gezocht bij JS references, op GoT, etc.

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
function Test ()
{
    this.last_response = 0;

    this.update_last_response = function() {

        alert( this.last_response );
        this.last_response += 1;

        this.responseID = setTimeout("this.update_last_response", 1000);
    }

}


Ik wil dat de object methode zichzelf recursief aanroept, dus gebruik ik "this.update_last_response" als argument van de setTimeout functie.

Op bovenstaande manier wordt de loop maar 1x uitgevoerd, er gaat volgens mij dus iets niet goed met het meegeven van de object methode aan de setTimeout functie...

Weet iemand hoe ik dit moet doen? Verder zou ik ook graag hier wat meer informatie over lezen, over de logica van OOP in JavaScript...

Bij voorbaat dank!

[edit] Meegeven van "this.update_last_response()" geeft een error. Zonder de quotes (") geeft ook een error.

[ Voor 9% gewijzigd door Verwijderd op 22-07-2005 16:41 ]


Verwijderd

Mits javascript delegates ondersteunt zou je iets in die trend kunnen gebruiken?

[ Voor 32% gewijzigd door Verwijderd op 22-07-2005 16:47 ]


Verwijderd

Topicstarter
Verwijderd schreef op vrijdag 22 juli 2005 @ 16:45:
Mits javascript delegates ondersteunt zou je iets in die trend kunnen gebruiken?

Geen idee wat delegates zijn...

Verwijderd

Verwijderd schreef op vrijdag 22 juli 2005 @ 16:48:
[...]


Geen idee wat delegates zijn...
Een beetje kort door de bocht zijn het anonieme functies. Zoals pointers in C++ zeg maar. Daarmee zou je dus functies als argument in een andere functie mee kunnen geven.

Verwijderd

eehmz, iets als setTimeout("Test.update_last_response.apply(this)","1000"):?

ben er eigenlijk een beetje uit met dat scope gebeuren
/me roept Clay :P

Verwijderd

Delegates zijn mogelijk in Javascript, maar veroorzaken circular refs welke tenzij je ze niet handmatig opruimt, niet worden verzameld door de garbage collector.

Wat de TS moet doen is zijn object even scopen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function Test ()
{
    this.last_response = 0;

    this.update_last_response = function() {

        alert( this.last_response );
        this.last_response += 1;
      
        var self = this;
        this.timer = setTimeout(function(){self.update_last_response()}, 1000);
    }

}

[ Voor 19% gewijzigd door Verwijderd op 22-07-2005 16:59 ]


Verwijderd

/me stuurt de TS trouwens maar gewoon even naar Clay toe:
http://www.xs4all.nl/~peterned/tutorial/scope.html

[ Voor 7% gewijzigd door Verwijderd op 22-07-2005 17:00 ]


Verwijderd

Verder wel interessant om te vermelden, dat je nu bij elke instantie van Test() ook een update_last_response method aanmaakt. Als je deze declareert als static scheelt het je zowiezo geheugen. :)

Verwijderd

Topicstarter
Hartstikke bedankt voor alle snelle hulp, vooral de link naar de site van Clay heeft me verder op weg geholpen.

Dit is wat ik nu heb:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function Test2 ()
{
    var bla = document.getElementById( 'bla2' );
    var self = this;
    this.last_response = 0;

    this.update_last_response = function() {
        if (this.last_response <= 10) {
            bla.value = this.last_response;
            this.last_response += 1;

            this.intervalID = setTimeout( function() {
                self.update_last_response();
            }, 1000);
        } else {
            clearTimeout( this.intervalID );
        }
    }

    this.update_last_response();
}

Kan iemand mij nog vertellen hoe ik dat met static doe? Heb wederom even Google gezocht, dingen geprobeerd, maar ik snap hem nog niet helemaal.

Later even alle pagina's van de site van Clay doorlezen.

Thanks!

[ Voor 3% gewijzigd door Verwijderd op 22-07-2005 19:28 ]


Verwijderd

Het hoeft zelfs niet static te zijn, als je maar zorgt dat je functies niet bij elke instantie worden aangemaakt.

Verder is de clearTimeout niet nodig, de timeout wordt maar eenmaal aangeroepen en clearTimeout helpt je alleen om een functie in een timeout te annuleren nog voordat die is uitgevoerd :)

function test(){

}
test.prototype.updateLastResponse = function(){
var self = this;
this.timer = setTimeout(function(){self.updateLastResponse()},1000);
}

Maar Clay zijn tutorial is zo laagdrempelig en to the point dat het allemaal na het lezen duidelijk wordt.

[ Voor 11% gewijzigd door Verwijderd op 22-07-2005 19:58 ]


  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 25-02 11:17

Clay

cookie erbij?

woei :w

setTimeout("this.watDanOok()", 1234);

werkt idd niet omdat de "this" in de timeout na 1234 ms naar window verwijst, en niet meer naar je instantie, vandaar die self truuk :) Staat ook in de tuto vermeld inc klein voorbeeld :)

* Clay gaat verder vakantie vieren ;)

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin

Pagina: 1