Reputation: 53
I'm trying to group some exisiting top-level functions inside a closure (to avoid polluting the global namespace) but I'm not quite getting it to work.
First, all the JS works outside my anonymous function, but once I put it in the anonymous function I get an error of "crossfade is not defined". Does anyone see anything completely obvious that I am missing?
I'm not quite getting why the the setInterval/crossfade works outside the anonymous function but not inside. Anything inside start() should be able to see vars/functions outside start() and it should all be protected in the closure created by the top-level anonymous function? I'm not trying to access anything within crossfade(), I'm just trying to execute it.
(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);
Upvotes: 5
Views: 4320
Reputation: 8850
When setInterval
is passed a string, the string is evaluated in global scope. That explains why crossfade
is not visible when setInterval
fires.
setInterval
can also be passed a function reference:
setInterval(crossfade, 5000);
in which case your code will work as expected, since crossfade
is visible at the point where you call setInterval
.
Upvotes: 2
Reputation: 86196
To avoid polluting the global scope, you can do a few things:
Upvotes: 1
Reputation: 700222
The setInterval
method will be run in the scope of the window, so the crossfade function doesn't exist there. You have to make an anonymous function so that a closure is created that contains a reference to the function:
cInterval = window.setInterval(function() { crossfade(); }, 5000);
Upvotes: 7
Reputation: 321588
Using setInterval('crossfade()', 5000);
doesn't create a closure - it creates a string to be eval()
d. You should use a function instead:
setInterval(function() { crossfade(); }, 5000);
Upvotes: 8