2010-11-08 13 views
25

Esta es mi primera inmersión real en JavaScript. Seguro que lo he usado antes, pero nunca he escrito nada desde cero.setTimeout ignora el tiempo de espera? (Incendios inmediatamente)

De todos modos, estoy teniendo un problema muy extraño que espero que alguien pueda descubrir por mí.

Estoy tratando de hacer que el texto de un div se desvanezca de negro a blanco. Simple, si?

El siguiente código funciona. Cambiará el color a blanco, sin embargo, se está ignorando el tiempo setTimeout de 500 ms.

Si usa Chrome y mira la consola JS, verá fácilmente que el método doFade() se está llamando casi instantáneamente, no cada 500 milisegundos.

¿Alguien puede explicar esto?

var started = false; 
var newColor; 
var div; 
var hex = 0; 

function fadestart(){ 
    if (typeof fadestart.storedColor == 'undefined') { 
     div = document.getElementById('test'); 
     fadestart.storedColor = div.style.color; 
    } 
    if(!started){ 
     console.log('fadestart'); 
     newColor = fadestart.storedColor; 
     started = true; 
     setTimeout(doFade(), 500); 
    } 
} 

function fadestop(){ 
    console.log('fadestop'); 
    div.style.color = fadestart.storedColor; 
    started = false; 
    hex = 0; 
} 

function doFade(){ 
    if(hex<=238){ 
     console.log(hex); 
     hex+=17; 
     div.style.color="rgb("+hex+","+hex+","+hex+")"; 
     setTimeout(doFade(), 500); 
    } 
} 

Respuesta

48

Usted necesita deshacerse de los paréntesis en doFade().

Los paréntesis invocan la función al instante.

Sólo tiene que utilizar esto en lugar: doFade

+0

En realidad, usted quiere 'dofade()' como una cadena, entre comillas. Tienes la causa raíz, sin embargo. –

+0

Sí 'func' se evalúa a la función en sí, mientras' func() 'llama a la función y evalúa su valor de retorno. –

+1

bastante seguro de que no necesita cotizaciones. Debería poder poner doFade o "doFade". Creo que incluso podría haber ligeros beneficios de rendimiento al no convertir la cadena "doFade" en el identificador de función. – KeatsKelleher

20
setTimeout(doFade(), 500); 

Esta línea dice "ejecutar doFade(), a continuación, pasar cualquier valor vuelve a setTimeout, que ejecutará este valor de retorno después de 500 milisegundos." Es decir, está llamando al doFade() allí mismo en el acto.

Saltar los paréntesis, a pase la función de setTimeout:

setTimeout(doFade, 500); 
4

Creo que se debe utilizar setTimeout(doFade, 500); o setTimeout("doFade()", 500);

+1

La llamada entrecomitada también funciona pero es horrible. Ver la respuesta de akellehe para más detalles. – ThiefMaster

+0

Sí, por supuesto. Mi hábito es pasar una función o incluso una función en línea. Pero citarlo siempre es otra opción (por supuesto, no es una mejor opción en la mayoría de los casos). – PeterWong

+0

Bueno, la función citada parece ser la única opción si pasa un parámetro. – asoundmove

Cuestiones relacionadas