Why would one write global code inside a function definition-call pair?

后端 未结 5 1644
轮回少年
轮回少年 2020-12-19 08:27

I see examples where JavaScript code including jQuery and jslint use the notation below:

(function(){
  // do something
})();

instead of:

5条回答
  •  粉色の甜心
    2020-12-19 08:52

    As everyone else has said, it's pretty much entirely to do with creating local scope. Another benefit is that you can use it to (for want of a better word) "rename" variables. Take for instance, how several javascript frameworks use $ as a shorthand for their main library function. If you create a closure like in your example, it doesn't matter what $ is outside, you can use it as a parameter and inside it can be whatever you want:

    // out here $ might be Prototype, something else, or even undefined
    (function($) {
        // in here, $ is jQuery
    })(jQuery);
    

    Another little tip for eking an extra couple of milliseconds of your script is to use this same technique to create an undefined variable. Most people think that undefined is a special keyword in javascript, but it's actually just treated as a normal variable, which you'd hope no one would define. The somewhat standard practice of checking for a undefined variable:

    if (x == undefined)
    

    ...is actually rather wasteful, since it checks the entire scope chain for a variable named "undefined". To shortcut this, you can use this method:

    (function($, undefined) {
        // code here
    })(jQuery);  // note that there's just one parameter passed
    

    Now that undefined is actually in a scope (with an undefined value), checking up the scope chain can stop at that point. Micro-optimisation, yes, but it doesn't hurt to know.

提交回复
热议问题