2009-11-24 23 views
5

Sto cercando di raggruppare alcune funzioni di primo livello esistenti all'interno di una chiusura (per evitare di inquinare lo spazio dei nomi globale) ma non sono del tutto farlo funzionare.Chiusura/scope JavaScript/jQuery

Innanzitutto, tutto il JS funziona fuori dalla mia funzione anonima, ma una volta inserito lo nella funzione anonima, viene visualizzato un errore "il crossfade non è definito come ". Qualcuno vede qualcosa di completamente ovvio che io sono mancante?

Non riesco a capire perché il setInterval/crossfade funziona all'esterno della funzione anonima ma non all'interno. Qualunque cosa all'interno start() dovrebbe essere in grado di vedere le vars/funzioni all'esterno start() e dovrebbe essere tutto protetto nella chiusura creata dalla funzione anonima di primo livello? Non sto tentando di accedere a qualsiasi cosa all'interno del crossfade(), sono appena cercando di eseguirlo.

(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); 

risposta

7

Il metodo setInterval saranno disputate nel campo di applicazione della finestra, in modo che la funzione di dissolvenza incrociata non esiste là. Devi fare una funzione anonima in modo che una chiusura si crea che contiene un riferimento alla funzione:

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

Grazie mille per me. –

8

Utilizzando setInterval('crossfade()', 5000); non crea una chiusura - si crea una stringa di essere eval() d. Si consiglia di utilizzare una funzione invece:

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

Vorrei usare setInterval (crossfade, 5000); – Nosredna

1

Per evitare di inquinare l'ambito globale, si può fare un paio di cose:

  • Estendere jQuery , dal momento che stai già usando jQuery. (Usa jQuery come spazio dei nomi.)
  • Crea un singolo oggetto per contenere i tuoi metodi. (Crea il tuo spazio dei nomi.)
2

Quando setInterval viene passato una stringa, la stringa viene valutata nell'ambito globale. Questo spiega il motivo per cui crossfade non è visibile quando si attiva setInterval.

setInterval può anche essere passato un riferimento funzione:

setInterval(crossfade, 5000); 

nel qual caso il codice funziona come previsto, dal momento che crossfade è visibile nel punto in cui si chiama setInterval.

+0

Sì, ho provato questo, ma ho un errore su di esso non essere chiamato con virgolette. –

+0

Il modo preferito è senza virgolette. Che messaggio di errore hai ricevuto, esattamente? – Nosredna