O'Reilly

Limiting Variable Scope Using (function(){})();

By on  

Simply put, a scope limiter is a self-executing function that defines a variables, performs a task, and clears those variables so that their scope is limited to the function itself. Take the following JavaScript code, for example:

/* do task 1:   */
var lynx = $$('a');
var divs = $$('div');
//(do stuff with links and divs)

/* do task 2 */
var lynx = $$('a'); //error:  lynx already defined!
var lis = $$('li');
//(do stuff with links and list items)

Everything above works but the second task can "see" the variables used to complete task one. This is undesirable as those variables from the first task could cause problems with later tasks. The better way to complete the two tasks is to use scope limiters for each:

/* do task 1:   */
(function() {
	var lynx = $$('a');
	var divs = $$('div');
	//(do stuff with links and divs)
})();

/* do task 2 */
(function() {
	var lynx = $$('a');
	var lis = $$('li');
	//(do stuff with links and list items)
})();

Sweet! Now the variables from the first task have scope only within their executed function scope and cannot affect other JavaScript within the "parent" scope.

Clean code FTW! Keep these techniques in mind when you're writing code that will be repurposed!

Track.js Error Reporting

Recent Features

  • CSS Gradients

    With CSS border-radius, I showed you how CSS can bridge the gap between design and development by adding rounded corners to elements.  CSS gradients are another step in that direction.  Now that CSS gradients are supported in Internet Explorer 8+, Firefox, Safari, and Chrome,...

  • Create a CSS Cube

    CSS cubes really showcase what CSS has become over the years, evolving from simple color and dimension directives to a language capable of creating deep, creative visuals.  Add animation and you've got something really neat.  Unfortunately each CSS cube tutorial I've read is a bit...

Incredible Demos

  • 9 Mind-Blowing WebGL Demos

    As much as developers now loathe Flash, we're still playing a bit of catch up to natively duplicate the animation capabilities that Adobe's old technology provided us.  Of course we have canvas, an awesome technology, one which I highlighted 9 mind-blowing demos.  Another technology available...

  • MooTools Gone Wild: Element Flashing

    If you're like me and lay awake in bed at night, you've flipped on the TV and seen the commercials: misguided, attention-starved college girls fueled by alcohol ruining their futures by flashing lame camera-men on Spring Break. Why do they do it? Attention,...

Discussion

  1. Proper programming technique is to define variables before use, and to use as few (preferably no) global variables as possible. What you have done in the examples are a work-around.

    I love all your other articles though!

  2. In this case you could define $$('a') globally but my example was more trying to display the two closures working separately.

  3. Will

    Doesn’t this sort of miss the point of closures? I always thought that ‘closure’ meant it ‘closed’ over variables available to it when being declared, so those variables were available even when they went out of scope. It’s hard to explain, but this example might help:

      function makeClosure() {
        var t = "foo";
        return function() {
          alert(t + "bar");
        }
      }
    

    So, you’d call makeClosure, which would return a function. Whenever the returned function was called, the value of t (“foo”) would still be available to it (thus returning “foobar”) even though t’s scope had expired when makeClosure ended.

  4. TheBigBabou

    Sorry David, I don’t want to be offensive, but your code examples are no closures. What you are showing and describing is limiting variables to function scope.

    A closure is a function or codepointer which accesses variables outside its scope. Like here:

    (function () {
    
    var out = 1;
    
    window.setTimeout(function () {
      alert(out);
    }, 100);
    
    })()
    

    The closure here would be the function, which is the first parameter to setTimeout. It doesn’t declare a variable “out”, but is able to access “out” from its outer function scope. As long as a variable stores a reference to this function, “out” is not freed from memory as well.

  5. Ugh, updated my post as the terminology was off. This should make more sense and be more direct.

  6. Good post. Function scoping is a great way to keep your code clean. I often use a model like this:

    (function() {
        // all my private stuff (vars and funcs) go here
        var foo = 'I am scoped, no one else sees me';
    
        var apiMethods = {
            // publicly exposed methods here
            // these methods still have access to privately scoped members
            bar : function() { alert(foo); }
        };
    
        // expose api methods
        window.MyNameSpace = apiMethods;
    })();
    
    // alerts value of foo
    MyNameSpace.bar();
  7. hi David!

    i hope you can help me.
    is it possible to implement your “load more posts” widget (http://net.tutsplus.com/tutorials/javascript-ajax/create-a-twitter-like-load-more-widget/) on a blogger blog? i guess the problem is the php implementation..
    i like very much the script but i supose is not possible to implement it on a blogger thing…

    any idea on that, David? maybe a go around trick…
    thank you very much in advance
    antónio torres
    http://www.vaiumagasosa.com

  8. Devi

    Thanks David! Cleared up some stuff I never really understood in Javascript. This is a good page I came across on function scope in Javascript as well:

    http://www.programmerinterview.com/index.php/javascript/javascript-function-scope/

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!

Recently on David Walsh Blog

  • OSCON Portland:  Conference  Discount!

    O'Reilly puts on the best web industry conferences in the world.  These conferences include Fluent Conference, Velocity Conference, and the upcoming OSCON in Portland, Oregon from July 20-24.  Open Source Convention (OSCON) is a conference that focuses specifically on open source developers and the tools and possibilities...

  • Follow Redirects with cURL

    I love playing around with cURL. There's something about loading websites via command line that makes me feel like some type of smug hacker, just like tweeting from command line does. I recently cURL'd the Google homepage and saw the following: I found it weird that Google...

  • Developers Have WordPress, Amateurs Have Squarespace, Professional Designers Have the NEW Webydo!

    Web design platforms have traditionally come in one of two varieties. There are the solutions like WordPress and Drupal that are incredibly powerful, but an understanding of web development and coding is required to be able to use those platforms effectively. On the other side of the...

  • Chris Coyierâs Favorite CodePen Demos II

    Hey everyone! Before we get started, I just want to say it’s damn hard to pick this few favorites on CodePen. Not because, as a co-founder of CodePen, I feel like a dad picking which kid he likes best (RUDE). But because there is just so...

  • GSAP + SVG For Power Users: Motion Along A Path

    Now that the GreenSock API is picking up steam, there are many tutorials and Getting Started guides out there to provide good introductions to the library, not to mention GreenSock’s own Forum and Documentation. This article isn’t intended for beginners, but rather a...