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 ;]