2012-01-11 16 views
5

Quiero distribuir mi código como funciones anónimas de auto-envio, como veo muchos hacen. Además, dentro de mi código tengo que controlar otra carga de lib, para poder usarla cuando esté disponible.setTimeout() en función recursiva dentro de una función de invocación automática

(function(window, document, undefined) { 
    staffHappens(); 
    var initMyLib = function() { 
    if (typeof(myLib) == 'undefined') { 
     setTimeout("initMyLib()", 50); 
    } else { 
     useMyLib(); 
    } 
    } 
    moreStaffHappens(); 
    initMyLib(); //-> initMyLib is undefined 
})(this, document); 

¿Cómo se puede encontrar este error? ¿Debería initMyLib estar dentro del alcance de la función envolvente (self-envoking)?

Respuesta

11

cambio setTimeout("initMyLib()", 50); a setTimeout(initMyLib, 50);

Cuando se pasa una cadena como argumento que tratará de evaluar cuando se dispara el tiempo de espera, pero se quedará en el ámbito global. Y su método no existe en el alcance global.


demo enhttp://jsfiddle.net/gaby/zVr7L/

+0

Eso no debería afectar el lugar donde está 'indefinido' aunque ... – Ktash

+0

@kTash, no debería, pero ¿está seguro de que la parte 'indefinida' proviene de esa línea y no una ejecución de la secuencia de comandos de tiempo de espera? –

+0

No lo sé. Esa es la línea que ha declarado que ocurre, así que estoy pensando que ha terminado la depuración para darse cuenta de eso ... Esto fue lo primero que pensé, pero si ocurre en la línea especificada y no en el tiempo de espera, entonces No estoy seguro de que esto sea correcto. Simplemente estaba pensando en voz alta – Ktash

1

También es posible usar una función anónima real de evitar la determinación del alcance cuestiones:

(function() { 
    if(typeof(myLib) == 'undefined') 
     setTimeout(arguments.callee, 50); 
    else 
     // loaded 
})() 
+1

Una solución válida, pero como 'arguments.callee' está en desuso en las últimas versiones de JavaScript, debes evitar usarlo y usar el sugerido que se llama funciones. Esto también podría hacerse con' (función name() {'y luego use' setTimeout (name, 50); ' –

+0

@Gaby aka G. Petrioli: Lo sé. Aún así,' callee' es una característica interesante que vale la pena conocer. – georg

+0

de hecho es ... –

Cuestiones relacionadas