2009-11-24 10 views
5

Estoy intentando agrupar algunas funciones de nivel superior existentes dentro de un cierre (para evitar contaminar el espacio de nombre global) pero no estoy del todo haciendo que funcione.Cierre/alcance JavaScript/jQuery

En primer lugar, todos los JS funcionan fuera de mi función anónima, pero una vez que pongo en la función anónima me sale un error de "crossfade no está definido". ¿Alguien ve algo completamente obvio que estoy desaparecidos?

No entiendo por qué el setInterval/crossfade funciona fuera de la función anónima pero no dentro. Cualquier cosa dentro de start() debería ser capaz de ver vars/functions fuera de start() y debería estar protegido en el cierre creado por la función anónima de nivel superior? No estoy tratando de acceder a nada dentro de crossfade(), solo estoy tratando de ejecutarlo.

(function($) { 

    //vars up here that internal functions can access 
    //also using some jquery inside here, so using $ 

    function crossfade() { 
     //body here 
    } 

    //other functions 

    function start() { 
     //body here 

     cInterval = setInterval('crossfade()', 5000); 
    } 

})(jQuery); 

Respuesta

7

setInterval El método se ejecutará en el marco de la ventana, por lo que la función de fundido no existe allí. Tienes que hacer una función anónima de manera que se crea un cierre que contiene una referencia a la función:

cInterval = window.setInterval(function() { crossfade(); }, 5000); 
+0

Muchas gracias, esto funciona para mí. –

8

Usando setInterval('crossfade()', 5000); no crea un cierre - se crea una cadena para ser eval() d. Debe utilizar una función en su lugar:

setInterval(function() { crossfade(); }, 5000); 
+6

Usaría setInterval (crossfade, 5000); – Nosredna

1

para no contaminar el alcance global, puede hacer algunas cosas:

  • Extender jQuery , ya que estás usando jQuery. (Use jQuery como espacio de nombres).
  • Cree un único objeto para guardar sus métodos. (Cree su propio espacio de nombre.)
2

Cuando se pasa una cadena a setInterval, la cadena se evalúa en alcance global. Eso explica por qué crossfade no está visible cuando se activa setInterval.

setInterval también se puede pasar una referencia de funciones:

setInterval(crossfade, 5000); 

en cuyo caso el código se funciona como se esperaba, ya que crossfade es visible en el punto donde se llama a setInterval.

+0

Sí, lo intenté, pero me sale un error al decir que no se llama con comillas. –

+0

La forma preferida es sin las comillas. ¿Qué mensaje de error obtuviste exactamente? – Nosredna