5

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);
asked Nov 24, 2009 at 18:57

4 Answers 4

8

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);
answered Nov 24, 2009 at 19:00
Sign up to request clarification or add additional context in comments.

1 Comment

I'd use setInterval(crossfade,5000);
7

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);
answered Nov 24, 2009 at 19:03

Comments

2

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.

answered Nov 24, 2009 at 19:09

2 Comments

Yeah, I tried this, but I get an error about it not being called with quotes.
The preferred way is without the quotes. What error message did you get, exactly?
1

To avoid polluting the global scope, you can do a few things:

  • Extend jQuery, since you're already using jQuery. (Use jQuery as a namespace.)
  • Create a single object to hold your methods. (Create your own namespace.)
answered Nov 24, 2009 at 19:04

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.