2009-06-02 17 views
32

Zwei Fragen:setInterval/SetTimeout Rückgabewert

  1. Wie der Wert von setInterval und setTimeout (diejenigen verwendet zu löschen, die Zeitgeber) berechnet zurückgegeben wird?

  2. Können beide Funktionen zur Laufzeit den gleichen Wert liefern? Zum Beispiel:

    var a = setInterval(fn1, 1000);
    var b = setTimeout(fn2, 1000);

Ist es möglich, für a und b den gleichen Wert zu haben?

Die erste Frage ist eher eine für mein Wissen, aber die zweite ist wichtiger.

Antwort

32

Returns a value which can be used to cancel the timer. So wäre es unwahrscheinlich, dass sie den gleichen Wert zurück (es sei denn, sie Wiederverwendung Werte sind und einer der Zeitgeber bereits abgesagt)

Mozilla states it's DOM level 0, but not part of the specification. (schauen Sie unten auf der Seite)

ich habe eine noch bessere Referenz bekam:

Nabble sagt:

SetTimeout und setInterval sind fro m die ursprüngliche Javascript-Spezifikation, Pre-ECMA. Diese Spezifikation ist nicht offiziell überall standardisiert, aber es wird von allen Web-Browser und den meisten Implementierungen der Javascript-Sprache unterstützt. (Einschließlich ActionScript.)

Die Pre-ECMA-Spezifikationen sind oft als die "DOM-0" APIs bekannt. Da sie nie zuvor genormt wurden, macht es Sinn für HTML5, schließlich spec die nicht veralteten APIs in einem Versuch , um eine konsistente Umgebung über Browsern bereitzustellen. Vor allem, wenn jüngsten Ereignisse haben bewiesen, dass es Unternehmen sind, die gerne den Buchstaben des Standards, aber nicht der Geist implementieren.Lesen

die ursprüngliche Spezifikation here oder von Sun (die ein frühes Endorser von JavaScript war).

+0

+1 für die Website Ref (besser, wenn es war MDC obwohl :) –

+0

hehe nvm, siehe es wurde hinzugefügt. –

+0

Ich wünschte, ich könnte zwei akzeptierte Antworten auswählen. Danke für die Referenzen! – aditya

2

Von der Mozilla-Website:

intervalID ist ein einzigartiges Intervall-ID (bis zu clearInterval passieren kann).

So ist es einzigartig :)

+1

Es kann in Bezug auf Werte, die von mehreren setInterval-Aufrufen zurückgegeben werden, eindeutig sein, garantiert jedoch nicht die Eindeutigkeit in Bezug auf Werte, die von SetTimeout zurückgegeben werden. –

+0

"Ist es möglich, dass beide Funktionen zur Laufzeit denselben Wert liefern?" - Also, ahh Nein, sie sind einzigartig :) – Ropstah

6

Ich denke, es ist kein normiertes Verhalten. In Firefox ist es nur Integer, inkrementiert bei jedem Anruf von setTimeout oder setInterval. Und nein, sie können nicht denselben Wert haben.

+0

Sie werden * nie * den gleichen Wert haben? Unabhängig davon, wie lange das Skript ausgeführt wird? – aditya

+1

Es lohnt sich, einen Blick auf meine Antwort für den genauen Hintergrund zu werfen, wie es unterstützt wird und ob es "in der Spezifikation" ist oder nicht. – cgp

+0

@aditya Ich denke, es überprüft, ob die ID, die es erzeugt, bereits im Speicher existiert, und erzeugt eine neue in dem seltenen Fall, dass es existiert. Das würde ich bei Zufallszahlen tun. –

1

Ob sie denselben Wert haben können, hängt von der JavaScript-Implementierung ab. Wie Maciej in Firefox erwähnt hat, können sie nicht denselben Wert haben wie der gleiche Zähler. In anderen Browsern kann das jedoch anders sein, daher ist es am besten, sich nicht darauf zu verlassen, dass sie nie den gleichen Wert haben.

31

testeten diese unter Opera 9, Safari 3, Firefox 3 und IE 7.

alle ganzzahligen Werte zurückgeführt, beginnend mit 1 und dann von 1 für jeden Anruf zu setTimeOut()setInterval() und Inkrementieren. Mir ist jedoch aufgefallen, dass die Browser die Zähler gestartet und anders behandelt haben:

  • IE begann mit einer (scheinbar) zufälligen 6-stelligen Nummer, aber nachfolgende Aufrufe an beide Funktionen erhöhten diese Zahl. Nach dem Schließen und Wiedereröffnen von IE fand ich heraus, dass die Startnummer zufällig erzeugt wurde, da sie nicht annähernd der Zählung der vorherigen Sitzung entsprach.
  • Opera führte einen Zähler für jede Registerkarte - das Schließen einer Registerkarte und das Öffnen einer neuen begann den Zähler von 1 in der neuen Registerkarte.
  • In Safari war die Anzahl global - Öffnen einer neuen Registerkarte und Aufruf der Funktionen in verschiedenen Registerkarten schien einen globalen Referenzzähler zu erhöhen.
  • In Firefox schien der Zähler bei 2 zu starten und wurde bei jedem weiteren Aufruf einer der beiden Funktionen erhöht. Wie Opera hatte jede Registerkarte ihren eigenen Zählerwert, aber sie schienen alle bei 2 zu starten.
  • Beachten Sie jedoch, dass in allen Szenarien keine zwei Kennungen (zumindest in der gleichen Registerkarte) identisch sind.

    +9

    Ich hatte gehofft herauszufinden, ob der zurückgegebene Wert immer truthy ist, und es scheint, dass dies der Fall ist, obwohl nicht angegeben. Danke, dass du all diese Browser überprüft hast. – w00t

    1

    Es klingt für mich, dass der zurückgegebene Wert der Indexwert für jede intern gehaltene Liste von Timern/Intervallen ist, die sie behalten.

    Wie in Punkt, ich rief ClearInterval (18) anstelle von ClearInterval (var_returned_from_set) und es gestoppt den gewünschten Timer/Intervall. (Tested FF17.0.1 und IE9.0.8)

    Auch in meinen eigenen Tests scheinen sie für die Lebensdauer der Seite für beide dieser Browser einzigartig zu sein.