2012-01-08 20 views
17

Necesito ejecutar una función javascript cada 10 segundos.Javascript setInterval no funciona

entiendo la sintaxis debe trabajar como seguimiento, pero no estoy recibiendo ningún éxito:

function funcName() { 
    alert("test"); 
} 

var func = funcName(); 
var run = setInterval("func",10000) 

Pero esto no está funcionando. ¿Alguna ayuda?

+0

Siempre es una buena idea ver qué dice la consola de errores de su navegador en estas situaciones. – Bojangles

+0

¿Sabes qué pasa cuando pasas '" func "' a 'setInterval' y qué valor tiene' func'? Siempre es útil leer [cierta documentación] (https://developer.mozilla.org/en/window.setInterval). –

+0

Pasar una cadena a 'setInterval()' (que en general es una mala idea en primer lugar) hace que haga un 'eval (" func ")'.Eso es esencialmente lo mismo que una línea de javascript como esta: 'func;' que no hace nada. Como cadena, tienes que ejecutar la función como 'setInterval (" func() ", 10000)', pero es mucho mejor pasar el nombre de la función real como 'setInterval (funcName, 10000)' y nunca forzarlo a use 'eval()' en primer lugar. – jfriend00

Respuesta

95

Muchas otras respuestas se centran en un patrón que sí funciona, pero sus explicaciones no son muy exhaustivas sobre por qué su código actual no funciona.

su código, para referencia:

function funcName() { 
    alert("test"); 
} 

var func = funcName(); 
var run = setInterval("func",10000) 

Vamos a desglosar esta información en trozos. Su función funcName está bien. Tenga en cuenta que cuando llama al funcName (en otras palabras, lo ejecuta) alertará al "test". Pero observe que funcName() - los paréntesis significan "llamar" o "ejecutar" la función - en realidad no devuelve un valor. Cuando una función no tiene un valor de retorno, se establece de manera predeterminada en un valor conocido como undefined.

Cuando llama a una función, agrega su lista de argumentos al final entre paréntesis. Cuando no tiene argumentos para pasar la función, simplemente agrega paréntesis vacíos, como funcName(). Pero cuando desea referirse a la función en sí, y no llamarla, no necesita los paréntesis porque los paréntesis indican que se ejecute.

Por lo tanto, cuando se dice:

var func = funcName(); 

En realidad se está declarando una variable func que tiene un valor de funcName(). Pero fíjate en los paréntesis. funcName() es en realidad el valor de retorno de funcName. Como dije anteriormente, dado que funcName en realidad no devuelve ningún valor, el valor predeterminado es undefined. Entonces, en otras palabras, su variable func en realidad tendrá el valor undefined.

entonces usted tiene esta línea:

var run = setInterval("func",10000) 

La función setInterval toma dos argumentos.La primera es la función que se ejecutará cada cierto tiempo, y la segunda es la cantidad de milisegundos entre cada vez que se ejecuta la función.

Sin embargo, el primer argumento realmente debería ser una función, no una cadena. Si es una cadena, el motor de JavaScript usará eval en esa cadena. Por lo tanto, en otras palabras, su setInterval se está ejecutando el siguiente código JavaScript:

func 
// 10 seconds later.... 
func 
// and so on 

Sin embargo, func es sólo una variable (con el valor undefined, pero eso es una especie de irrelevante). Entonces, cada diez segundos, el motor JS evalúa la variable func y devuelve undefined. Pero esto realmente no hace nada. Quiero decir, técnicamente está siendo evaluado cada 10 segundos, pero no vas a ver ningún efecto de eso.

La solución es dar a setInterval una función para ejecutar en lugar de una cadena. Por lo tanto, en este caso:

var run = setInterval(funcName, 10000); 

en cuenta que yo no le di func. Esto es porque func es no una función en su código; es el valor undefined, porque lo asignó funcName(). Como dije anteriormente, funcName() llamará a la función funcName y devolverá el valor de retorno de la función. Como funcName no devuelve nada, este se establece de manera predeterminada en undefined. Sé que ya lo he dicho varias veces, pero realmente es un concepto muy importante: cuando veas funcName(), debes pensar "el valor de retorno de funcName". Cuando desee referirse a la función en sí misma, como una entidad separada, debe dejar fuera el paréntesis para que no lo llame: funcName.

Por lo tanto, otra solución para su código sería:

var func = funcName; 
var run = setInterval(func, 10000); 

Sin embargo, eso es un poco redundante: ¿por qué utilizar func en lugar de funcName?

O puede mantenerse lo más fiel posible al código original mediante la modificación de dos bits:

var func = funcName; 
var run = setInterval("func()", 10000); 

En este caso, el motor de JS evaluará func() cada diez segundos. En otras palabras, alertará "test" cada diez segundos. Sin embargo, como dice la famosa frase, eval is evil, por lo que debe intentar evitarla siempre que sea posible.

Otro giro en este código es utilizar una función anónima. En otras palabras, una función que no tiene nombre: simplemente colóquela en el código porque no le importa cómo se llame.

setInterval(function() { 
    alert("test"); 
}, 10000); 

En este caso, ya no me importa lo que la función se llama, sólo dejan una función genérica, sin nombre (anónimo) allí.

+4

¡Gracias por tu respuesta clara! – mauzilla

2

Esto se debe a que debe pasar una función, no es una cadena:

function funcName() { 
    alert("test"); 
} 

setInterval(funcName, 10000); 

el código tiene dos problemas:

  • var func = funcName(); llama a la función de inmediato y le asigna el valor de retorno.
  • Just "func" no es válido, incluso si utiliza la sintaxis de evaluación parecida mala y obsoleta de setInterval. Sería setInterval("func()", 10000) para llamar a la función de tipo eval.
2

Prueba esto:

function funcName() { 
    alert("test"); 
} 

var run = setInterval(funcName, 10000) 
4

Cambio setInterval("func",10000) a cualquiera setInterval(funcName, 10000) o setInterval("funcName()",10000). El primero es el método recomendado.

Cuestiones relacionadas