2009-06-02 8 views
32

dos preguntas:setInterval/SetTimeOut valor de retorno

  1. ¿Cómo es el valor devuelto por setInterval y setTimeout (los que se usan para limpiar los temporizadores) calculado?

  2. ¿Es posible que ambas funciones devuelvan el mismo valor durante el tiempo de ejecución? Por ejemplo:

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

¿Es posible que a y b que tienen el mismo valor?

La primera es más una pregunta de mi conocimiento, pero la segunda es más importante.

Respuesta

32

Returns a value which can be used to cancel the timer. Por lo tanto, parece poco probable que vuelvan el mismo valor (a menos que sean los valores de reutilización y uno de los temporizadores ya ha sido cancelada)

Mozilla states it's DOM level 0, but not part of the specification. (mirar en la parte inferior de la página)

tengo una mejor referencia:

Nabble dice:

SetTimeout y setInterval están aquí para allá m la especificación original de Javascript, pre-ECMA. Esa especificación no es oficialmente estandarizada en cualquier lugar, pero es compatible con todos los navegadores web y la mayoría de las implementaciones del lenguaje Javascript . (Incluyendo ActionScript.)

Las especificaciones pre-ECMA a menudo se conocen como las API "DOM-0". Dado que tienen nunca antes estandarizado, tiene sentido para HTML5 especifique finalmente las API no desaprobadas en un intento para proporcionar un entorno coherente en todos los navegadores. Especialmente cuando eventos recientes han demostrado que hay empresas que desean implementar la letra de la norma, pero no el espíritu.

Leer la especificación original de here, o desde Sun (que era un endosante temprana de JavaScript).

+0

+1 para la referencia del sitio (mejor si era MDC) :) –

+0

hehe nvm, mira que se ha agregado. –

+0

Me gustaría poder elegir dos respuestas aceptadas. Gracias por las referencias! – aditya

2

Desde el sitio web de Mozilla:

intervalID es un identificador único intervalo se puede pasar a clearInterval().

Por lo tanto, es único :)

+1

Puede ser único con respecto a los valores devueltos de varias llamadas setInterval, pero eso no garantiza la exclusividad con respecto a los valores devueltos por setTimeout. –

+0

"¿Es posible que ambas funciones devuelvan el mismo valor durante el tiempo de ejecución?" - Entonces ehh No, son únicos :) – Ropstah

6

Creo que no es un comportamiento estandarizado. En Firefox, es solo un número entero, incrementándose en cada llamada de setTimeout o setInterval. Y, no, no pueden tener el mismo valor.

+0

* ¿Nunca * tendrán el mismo valor? Independientemente de cuánto tiempo se ejecuta el script? – aditya

+1

Merece la pena echarle un vistazo a mi respuesta para obtener los antecedentes sobre cómo es compatible y si está "dentro de la especificación" o no. – cgp

+0

@aditya Creo que comprueba si el ID que genera ya existe en la memoria y genera uno nuevo en el caso excepcional de que exista. Eso es lo que haría si tuviera que lidiar con números aleatorios. –

1

Si pueden tener el mismo valor depende de la implementación de JavaScript. Como mencionó Maciej en Firefox, no pueden tener el mismo valor ya que se usa el mismo contador. Sin embargo, eso podría ser diferente en otros navegadores, por lo que quizás sea mejor no confiar en que nunca tendrán el mismo valor.

31

probado este bajo Opera 9, Safari 3, Firefox 3 y IE 7.

todos los valores enteros devueltos, a partir de 1 y luego incrementando en 1 por cada llamada a setTimeOut() y setInterval(). Sin embargo, he notado que los navegadores empezaron los contadores y los manejan de forma diferente:

  • IE comenzó con un número de 6 dígitos (aparentemente) al azar, pero las posteriores llamadas a cualquiera de las funciones incrementan este número. Después de cerrar y volver a abrir IE, descubrí que el número inicial parecía generarse aleatoriamente, ya que no estaba ni cerca del recuento de la sesión anterior.
  • Opera mantuvo un contador para cada pestaña: cerrar una pestaña y abrir una nueva inició el contador desde 1 en la nueva pestaña.
  • En Safari, el recuento era global: abrir una pestaña nueva y llamar a las funciones en diferentes pestañas parecía incrementar un contador de referencia global.
  • En Firefox, el contador pareció comenzar en 2, y se incrementó en cada llamada posterior a cualquiera de las funciones. Al igual que Opera, cada pestaña tenía su propio valor de contador, pero todos parecían comenzar en 2.

Sin embargo, tenga en cuenta que en todos los escenarios, no hay dos identificadores (al menos en la misma pestaña) iguales.

+9

Tenía la esperanza de averiguar si el valor devuelto es siempre cierto, y parece que ese es el caso, aunque no se especifica. Gracias por verificar todos esos navegadores. – w00t

1

Me parece que el valor devuelto es el valor del índice para cualquier lista internamente mantenida de temporizadores/intervalos que guardan.

Como en el punto, llamé a clearInterval (18) en lugar de clearInterval (var_returned_from_set) y detuvo el temporizador/intervalo deseado. (Probado FF17.0.1 e IE9.0.8)

También en mis propias pruebas parecen ser únicas durante la vida de la página para ambos navegadores.