2010-02-18 15 views
11

tengo código como este:¿Con qué se llama la función asignada a setTimeout?

setTimeout(foo, 600); 

siempre pensé que foo no tomaron ningún argumento, por ejemplo:

function foo() { /* bars */ } 

Sin embargo, haciendo lo siguiente:

function foo(a) { alert(a); /* bars */ } 

metimos una alerta que muestra -7. ¿Qué representa este número?

+1

¡Gran pregunta! Nunca había pensado en probar esto antes. – Nicole

Respuesta

8

Es la diferencia de tiempo (en milisegundos) desde el momento en que se programó para ejecutarlo y cuándo se ejecutó realmente.

alert(setTimeout(function(a) { alert(a) }, 2000)); 

Si desactiva la primera alerta en el tiempo, verá la siguiente alerta está en algún lugar de -10 a 10. Si espera unos segundos, verá algo que es alrededor del tiempo que esperó menos 2.000.

Lo mismo se puede ver para setInterval. Ejecute lo siguiente en Firebug:

setInterval(function(a) { alert(a); }, 2000); 

Intente cerrar la alerta rápidamente, alrededor de 0 nuevamente. Déjalo abierto: te dará un gran valor.

Nota Esto está en Firefox Mac, donde mantener una alerta abierta detendrá el procesamiento de Javascript, por lo que el temporizador no se ejecutará hasta que cierre la alerta. El comportamiento de las pruebas anteriores puede ser diferente en otros navegadores

+0

sí ... está documentado de una manera muy pequeña aquí: https://developer.mozilla.org/en/DOM/window.setTimeout. parece que es algo solo de Firefox – Claudiu

+0

Una característica muy inteligente, lástima que IE no lo tenga también. Por otra parte, es una pena IE no tiene muchas cosas :-) –

+1

@Andy E Si nos fijamos en https://bugzilla.mozilla.org/show_bug.cgi?id=394769 parece que hay una gran controversia sobre su existencia en absoluto, ya que reduce la usabilidad de funciones con argumentos opcionales llamados por setTimeout. – Nicole

3

Por lo que puedo decir ... el argumento en la diferencia entre cuándo fue programado y cuándo realmente se ejecutó en milisegundos. Curiosamente, parece ciertos navegadores como incluso fracciones de segundos enteros ...

<script> 
var a = setInterval(foo, 125); 

console.log(a); 

function foo(b) { 
console.log(b); 
} 
</script> 

es la salida de un montón de ceros, lo mismo que 250, 500, 1000 ... mientras que la producción

<script> 
var a = setInterval(foo, 127); 

console.log(a); 

function foo(b) { 
console.log(b); 
} 
</script> 

voluntad

-2 
12 
-6 
8 
-10 
4 
2 
0 
-2 
-4 
9 
-8 
5 
3 
1 
Cuestiones relacionadas