I want to distribute my code as a self-envoking anonymous functions, as I see many do. Also, within my code I have to monitor for another lib loading, so I can use it when it's available.
(function(window, document, undefined) {
staffHappens();
var initMyLib = function() {
if (typeof(myLib) == 'undefined') {
setTimeout("initMyLib()", 50);
} else {
useMyLib();
}
}
moreStaffHappens();
initMyLib(); //-> initMyLib is undefined
})(this, document);
How can this error occur? Should initMyLib be inside the scope of the enclosing (self-envoking) function?
change
setTimeout("initMyLib()", 50);
tosetTimeout(initMyLib, 50);
When you pass a string as an argument it will try to evaluate it when the timeout is fired, but it will run in the global scope. And your method does not exist in the global scope.
Demo at http://jsfiddle.net/gaby/zVr7L/
Try reading this answer for some clues: recursive function vs setInterval vs setTimeout javascript
This is the code sample from that answer:
You could also use a real anonymous function to avoid scoping issues: