2012-03-28 12 views
29

Cuando se trabaja en algo de JavaScript para una aplicación web, me di cuenta de que había utilizado setTimeout, pero yo había tratado de borrar con clearInterval y se detuvo el tiempo de espera que se produzcan en Google Chrome e Internet Explorer 9.¿clearTimeout y clearInterval son los mismos?

son clearTimeout y clearInterval intercambiables?

Here's a JSfiddle con un ejemplo de lo que estoy hablando.

+4

Si bien esto es probablemente cierto en la mayoría de las implementaciones, no debe confiar en él, ya que no está definido de esta manera. –

+0

Puede funcionar en algunos navegadores, pero podría no funcionar igual en todos los navegadores, por lo que en realidad no lo haría. –

+0

¡Gran pregunta (y respuestas) gracias por preguntar! – Myster

Respuesta

19

No, no son intercambiables.

Claro, algunos navegadores pueden muy bien compartir el mismo código para borrar los intervalos y los intervalos de la misma manera, pero no significa que son intercambiables y no son ciertamente garantiza que iban a trabajar el mismo en todas las implementaciones de navegador . Se trata de que estos dos métodos se definan de manera diferente para diferentes propósitos y, por lo tanto, debe usarlos para sus usos designados. De lo contrario, solo está pidiendo problemas.

0

Incluso si se pueden utilizar como sinónimos, ahora podría cambiar en cualquier momento en el futuro. ¿Por qué no deberías llamar a una espada una pala? :-)

+1

Sí, esa es una buena práctica estándar para no utilizar la funcionalidad no publicada, pero eso no responde a la pregunta que ahora lo hace. – Daisetsu

19

En realidad, creo que podemos hacer una conclusión bastante sólida a partir de las especificaciones del W3C (http://www.w3.org/TR/html5/webappapis.html#timers). No se garantiza de manera explícita, pero tenemos una gran cantidad de evidencia de que casi cualquier aplicación razonable tendría este comportamiento:

1) Tiempos de espera e intervalos de hecho utilizan la misma función subyacente:

El método setTimeout() debe devuelve el valor devuelto por los pasos de inicialización del temporizador, pasándolos los argumentos del método ... y el indicador de repetición establecido en falso.

El método setInterval() debe devolver el valor devuelto por los pasos de inicialización del temporizador , pasándoles los argumentos del método .... y el indicador de repetición establecido en verdadero.

2) Esta sola función - los "pasos de inicialización del temporizador" mencionados anteriormente - utiliza una única lista de temporizadores:

2, ... dejar que manejar un entero definido por el usuario-agente que es mayor que cero que identificará el tiempo de espera que establecerá esta llamada en la lista de temporizadores activos .

10: Vuelve mango ...

3) clearTimeout() y clearInterval() ambos operan en esa lista (y de hecho no se diferencian por la especificación de ninguna manera)

Los métodos clearTimeout() y clearInterval() deben borrar la entrada identificada como identificador de la lista de temporizadores activos del objeto WindowTimers en el que se invocó el método, donde handle es el argumento pasado al método, si lo hay. (Si handle no identifica una entrada en la lista de temporizadores activos del objeto WindowTimers en el que se invocó el método, el método no hace nada.)

Creo que esto presenta un caso bastante fuerte que clearTimeout y clearInterval también debe según la especificación. Esto está respaldado por el hecho de que esto funciona en todos los navegadores que probé (Chrome 37, Firefox 33 y Opera 25).

+6

No sé si es solo un código incorrecto, pero el segundo ejemplo en la introducción de la API de visibilidad de página usa 'setInterval' y' clearTimeout' juntos: http://www.w3.org/TR/page-visibility/# Introducción – TheZ

8

Desde el Mozilla reference:

Vale la pena señalar que el grupo de identificadores utilizados por setTimeout() y setInterval() son compartidos, lo que significa que puede técnicamente utilizar clearTimeout() y clearInterval() intercambiable . Sin embargo, para la claridad , debe evitar hacerlo.

Cuestiones relacionadas