2010-12-08 26 views
7

Hola, tengo algo como esto:La función no se define en setInterval

$(document).ready(function(){ 

$("#all").height($(window).height()-60); 

$('a').bind({ 
    mouseover:function(){ 
    $(this).stop().animate({opacity:0.8},500); 
}, 
mouseout:function(){ 
    $(this).stop().animate({opacity:1},500); 
}, 
    click:function(){ 
} 
}); 


// CLOUDS SCROLL 

function cloudScroll(){ 
    var current=parseFloat($('#clouds').css('left')); 
    current += 1; 
    $('#clouds').css("left",current); 
} 

var init = setInterval('cloudScroll()', 270); 

}); 

parece ser bastante fácil, pero de todos modos se devuelve: cloudScroll no está definido.
¿Por qué?

Respuesta

22

Trate de pasar directamente a la función, el uso de una cadena es bastante obsoleta:

var init = setInterval(cloudScroll, 270); 
0

Si pasa una referencia de función, en lugar de una cadena, entonces todo funcionará:

var init = setInterval(cloudScroll, 270); 

Sólo para muestran que funcione: http://jsfiddle.net/jonathon/T45Nx/

2

seguirlo:

var init = setInterval(cloudScroll, 270); 

... y si quieres pasar argumentos:

setInterval(scrollCloud, 250, clouds2); 

EDIT Partrick mencionó que IE no soporta pasar argumentos de la forma anterior. Sorprendido, no lo hice ahora. De todos modos, eso hace que el uso de mqsoh de una función anónima sea relevante. Debido a que puede ejecutar una determinada función con argumentos, así:

setInterval(function(){ 
    scrollCloud(clouds2); 
}, 250); 
+0

maldita sea, soy demasiado lento hoy. Esta es la segunda pregunta que he respondido hoy en la que alguien le ganó carne :) – Zevan

+2

El parámetro argumentos adicionales no es compatible con IE . – user113716

+0

+1 @patrick ... maldita sea, apesta, sorprendido de que no lo supiera. – Zevan

9

setInterval se ejecuta en el espacio de nombres global, pero su función de desplazamiento de nubes se define en la función document.ready anónimo.

Debe arreglar el problema y es también mejor forma de pasar referencias de las funciones a setInterval en lugar de cuerdas (que al final conseguir evaled, lo que es peor para el rendimiento):

setInterval(function(){ cloudsScroll() }, 270); 

También puede poner la definición cloudScroll en la función de intervalo.

+2

+1 por dar la razón –

+1

no estoy seguro de que exista una ventaja al usar una función anónima aquí. Buena respuesta sin embargo. – Zevan

+0

Eso explica por qué mis funciones timeout y setInterval nunca volvieron a funcionar. ¡Maldita seas la ejecución global del espacio de nombres! Gracias 'mqsoh'. Eso ayudó totalmente. – racl101

Cuestiones relacionadas