jerome wrote:
(function(){
...
})();

How is this basic to understanding how jQuery works, and how
JavaScript works?

The basic idea is that global variables are evil. This technique moves what would otherwise be global variables into a closure [1], removing them from the global scope. For example, in the following code

    var count = 0;
    function createClickHandler(nbr) {
        return function() {
            alert("You clicked dead link " + (1 + nbr));
        }
    }
    var links = document.getElementsByTagName("A");
    for (var i = 0; i < links.length; i++) {
        var link = links[i];
        if (link.getAttribute("href") == "#") {
            link.onclick = createClickHandler(count++);
        }
    }

all the variables used are now available in the global scope, including "count", "links", the function "createClickHandler", and, perhaps surprisingly, "i" and "link". You can see for yourself by clicking the button on this page:

    http://scott.sauyet.com/Javascript/Demo/2009-06-22a/

If, however, you surround the code with "(function(){" and "})();", as you can see at

    http://scott.sauyet.com/Javascript/Demo/2009-06-22b/

the variables are no longer defined when you click the button. You've removed the variables from the global scope.

As to the syntax, what you are seeing is an anonymous function created and then immediately applied. You could do this with a named function like this:

    function myFunc() {
        // code here
    }
    myFunc();

but then you've added "myFunc" to the global namespace. By removing the function name, you are adding nothing at all to the global namespace. Ideally, this would be accomplished with syntax more like this:

    function() {
        // code here
    }();

i.e., we create the function and apply it. But that syntax is not legal. For technical reasons, you need to surround the anonymous function with parentheses to be able to apply it with the "()" operator,
and we end up with

    (function() {
        // code here
    })();

As to how closures manage to keep the global namespace clean, you will need to read up on closures. [1]

This has become a very common idiom in JavaScript programming, and it really is important to understand it if you want to work with any but the most basic of modern scripts.

Cheers,

  -- Scott

[1] http://www.google.com/search?q=javascript+closure

Reply via email to