2010-10-15 4 views
24

Ich schreibe eine Überprüfung, um zu sehen, ob ein Timeout aktiv ist. Ich dachte, dies zu tun:Kann setTimeout jemals 0 als die ID zurückgeben?

var a = setTimeout(fn, 10); 
// ... Other code ... where clearTimeout(a) can be called and set to null 
if (a != null) 
{ 
    // do soemthing 
} 

ich mich gefragt, ob es überhaupt möglich wäre, dass eine 0. In diesem Fall werde ich a !== null

Antwort

3

Erstens: 0 ist nicht das Gleiche wie null, (0 == null) wäre in jedem Fall falsch ';

Wenn Sie "a" gegen etwas testen möchten: Definieren Sie zuerst 'a' und weisen Sie später settimeout 'a' zu. dann überprüfe den Typ von "a". Wenn es "undefiniert" ist, hat der Timer noch nicht ausgelöst

+0

Mein Fehler :) Ich habe nicht überprüft, aber ja '0! = Null' immer. Ich erwartete, dass sie in Javascript gleich sind, wenn man Gleichheiten wie '' und 0 berücksichtigt - aber das ist nicht der Fall. – Aishwar

13

Die Spezifikationen von Microsoft, Sun und Mozilla sagen verwenden würde nur dass es eine ganze Zahl zurückgibt. So kann 0 enthalten sein.

Es ist möglich (und wahrscheinlich), dass einige Implementierungen 0 ausschließen, aber Sie sollten sich nicht darauf verlassen. Du solltest mit der !== gehen.

Fassen wir zusammen: Obwohl wahrscheinlich alle Browser 0 von den IDs zurück von setTimeout auszuschließen, sollten Sie Ihren Code mit diesem Gedanken schon gar nicht schreiben, wenn alle tun müssen, ist eine zusätzliche = hinzuzufügen.

+0

+1 Danke. Sie haben meine Frage beantwortet, obwohl die angenommene Antwort meine Bedenken ansprach. – Aishwar

20

It shouldn't dies gegeben:

handle = window . setTimeout(handler [, timeout [, arguments ] ]) 

Lassen handle eine Benutzer-Agent-definierte ganze Zahl sein, die größer ist als Null dass das Timeout identifizieren wird durch diesen Aufruf gesetzt werden.

+1

Sind das nicht HTML5-Spezifikationen? –

+1

@Alin: Ich kam zu dieser Seite über https://developer.mozilla.org/en/DOM/window.setTimeout, wo es heißt, dass es Teil von DOM Level 0 ist. Also dachte ich, das ist eigentlich älter als HTML5, aber vielleicht interpretiere ich etwas falsch. –

+0

+1 Danke für den Link. Sie haben meine Frage beantwortet, obwohl die angenommene Antwort meine Bedenken ansprach. – Aishwar

2

Die meisten Browser einen int zurückkehren, beginnend bei 1 und für jeden Aufruf von setTimeout Inkrementieren so in der Theorie es nie im Sinne 0.

Aber halten könnte sein, dass dies nicht wirklich eine Anforderung der Spezifikation ist, neigen nur eine Konvention Browsern zu folgen. Siehe die akzeptierte Antwort hier für weitere Details: setInterval/setTimeout return value

+3

Es ist offenbar Teil der HTML5-Spezifikation (http://www.w3.org/TR/html5/timers.html). Pre-HTML5 war nur eine Konvention. – mhenry1384