JavaSript setTimeout i obiekty

0

Cześć mam pytanie. W jaki sposób skojarzyć wywoływane funkcji setTimeout lub setInterval z obiektem.
Dokładniej mówiąc mam taki kod.

Object=function(title)
{
this.title_=title;
}

Object.prototype.start = function()
{
_me=this;
document.getElementById('respdiv').innerHTML+=(this.title_+" ");//tu wyświetlam w przeglądarce
window.setTimeout(function(){_me.start();},100); //tu ponownie wywołuje metodę start dla obiektu
}

Inicjalizacja:

var v1 = new MyObject("1");
var v2 = new MyObject("2");
v1.start();
v2.start();

I odpowiedź w przeglądarce:
1 2 2 2 2 ....
Jak widać po wywołaniu metody setTimeout dla drugiego obiektu pierwszy setTimeout przestał działać. Co zrobić aby odpowiedź wyglądała tak:1 2 1 2 1 2 1 2... ??

0

Hm hm, w zasadzie wystarczy zamienić:

_me=this;

na

var _me=this;

sprawdzane pod IE oraz FF - działa poprawnie.
co było nie tak? _me bez var było globalne, każdy kolejna instancja obiektu nadpisywała to _me.

btw: zamiast _me ja bym chyba sobie pozwolił na:

function $(n) {
    return document.getElementById(n);
    }

MyObject.prototype.start = function() {
    with(this) {
        $('respdiv').innerHTML += (title_ + " ");
        window.setTimeout( function(){ start(); }, 100 );
	}
    }

dzięki with, nazwa funkcji start zostanie dobrze skojarzona z obiektem automatycznie, bo... jakby to ująć - ta zmienna lokalna _me mnie niepokoi ;) Nie to, że jest niedobra, po prostu na dzień dzisiejszy moja wiedza na temat zakresu życia zmiennych mówi: "_me jest lokalne, powinno zniknąć, setTimeout powinien protestować". No ale skoro idzie i tak i tak - cieszmy się.

0
Ranides napisał(a)

ta zmienna lokalna _me mnie niepokoi ;) Nie to, że jest niedobra, po prostu na dzień dzisiejszy moja wiedza na temat zakresu życia zmiennych mówi: "_me jest lokalne, powinno zniknąć, setTimeout powinien protestować". No ale skoro idzie i tak i tak - cieszmy się.

spokojnie, to wszystko jest opisane w specyfikacji javascript
można tak robić i o nic się nie martwić, jak nie zadziała to nie jest to twoja wina

0

Na słowo "standard"/"specyfikacja", to się chyba tak uczulę jak Deus. Nie bądź Panie Zielonka taki hop do przodu, bo ani w ECMA-262 ani w W3C nie ma NIC o setTimeout :> . Przepraszam, w3c w jakimś "drafcie" napisano, że "wywołuje kod po pewnym czasie", i to by było na tyle.

ECMA mówi za to o czymś takim jak "Scope Chain" i "Execution Context".

function out(value) { document.getElementById('respdiv').innerHTML += value; }

var MyObject = function(title) {
	this.title_=title;
	}

MyObject.prototype.start = function() {
    var temp = 7;
    var _me = this;
	
    out(this.title_ + ' ');
    window.setTimeout(
        function(){ out('<i>'+temp+'</i> '); _me.start();  }, 
	3000
	);

    temp = 0;
    return ' x ';
    }

var v1 = new MyObject("1");
var v2 = new MyObject("2");
out( v1.start() );
out( v2.start() );

Taki kod pokazuje już na chama i totalnie, że nasza funkcja anonimowa używa referencji do zmiennych lokalnych ze start. Jednocześnie pokazuje, że zmienne istnieją mimo, że funkcja start już dawno zwróciła wynik, znaczy zakończyła się. "Garbage Collector" czuwa, i trzyma jej zmienne? Tylko wybrane, czy cały "activation object" aż do zakończenia timeout-a?

Tylko Firefox mówi wyraźnie, że

Code executed by setTimeout() is run in a separate execution context to the function from which it was called.

z drugiej strony, skoro zmienne lokalne ze "start" są odnajdywane i używane przez referencję, to by wskazywało, że setTimeout w dużej mierze działa tak, jak eval opisany w ECMA-262. Ale cholera wie, i cholera dojdzie.

gfdgdf napisał(a)

można tak robić i o nic się nie martwić, jak nie zadziała to nie jest to twoja wina

martwić to zawsze jest o co, zwłaszcza, gdy coś działa :D No i jak coś zwalę, to nie ważne czy moja wina, ważne, że będę musiał to zrobić od nowa ;]

0

nie mówiłem o setTimeout tylko o zmiennych właśnie

1 użytkowników online, w tym zalogowanych: 0, gości: 1