admin管理员组

文章数量:1291207

I'm pretty new to JavaScript, which I am learning on my own. I'm currently creating and tweaking GreaseMonkey scripts. I've noticed that most simple scripts (i.e. those with no need for named functions) go straight into the main code, but some instead are set up like this:

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

What is the significance of this type of coding? I've mented out both the top and bottom, and the script still runs exactly the same.

Is it just a coding standard, or does it actually have a function? And, as my title asks, is it something specific to GreaseMonkey, or something that I should do all the time?

I'm pretty new to JavaScript, which I am learning on my own. I'm currently creating and tweaking GreaseMonkey scripts. I've noticed that most simple scripts (i.e. those with no need for named functions) go straight into the main code, but some instead are set up like this:

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

What is the significance of this type of coding? I've mented out both the top and bottom, and the script still runs exactly the same.

Is it just a coding standard, or does it actually have a function? And, as my title asks, is it something specific to GreaseMonkey, or something that I should do all the time?

Share Improve this question asked Dec 19, 2010 at 6:18 trlklytrlkly 512 bronze badges 3
  • but this one answered more of it than the rest the answer you selected did not answer more of your question, it answered other questions you didn't ask. People here could just as easily bring up other topics that weren't asked in your question. The point of SO is to have specific questions with specific answers. The answer you selected seems bloated. Plus, it's someone with a low score who did an awesome job. This should not have an effect on who you give answers to. There should be no bias in choosing answers, it should be an objective decision. – vol7ron Commented Dec 19, 2010 at 21:15
  • Or I can decide who I want to give whatever I want to, and I can downvote you for clearly trying to manipulate people into giving you the higher score. Seeing as you think it's okay to badger people for an upvote, I have reason to believe that your score is artificially inflated. – trlkly Commented Mar 9, 2012 at 14:13
  • You can decide, much like others can decide to downvote. I did not ask for any score, I merely suggested the answer you chose wasn't only less plete, but it was wrong - I didn't say anything about mine. You should either ask a better question, or select the answer that answers yours best - not the answer that you think you learned the most from. I will add that the answer you selected has nothing to do with closures and neither does your question - it is simply wrong. You can harass me as you wish, but then don't expect my help in the future. Good luck to you. – vol7ron Commented Mar 9, 2012 at 20:45
Add a ment  | 

4 Answers 4

Reset to default 10

This technique effectively creates a private namespace, accessible only to this script. For example, this code:

(function() {
    var a = 5;
})();

will have no effect on the global namespace (the a variable is captured by the closure, so window.a will not be affected). It's a very nice way to keep many scripts from stepping on each other's global variables, by making them not global at all. I use this technique all the time when writing any JavaScript, not just Greasemonkey scripts, and would strongly remend it as a best practice when writing libraries.

If you wanted to expose some functions to other JavaScript code instead of pletely isolating your script, you could do something like this:

var MyNamespace = (function () {
    var that = {};

    that.square = function(x) {
        return x*x;
    };

    return that;
})();

Then you could do MyNamespace.square(5) from another script, and this would return 25.

It's a self executing anonymous function.

It's usually used to change the scope, all variables/functions declared inside this will be in the anonymous function's scope instead of the global (window) scope.

The code serves two purposes:

  1. It keeps objects/variables local to the anonymous function scope. This is important as we see that you may have several script files that all might share the same variable name. If they did, they could replace the variables value and truly muck with your application.

  2. The () at the the end of the line calls the declared function. In other words, the anonymous function you created inside the first set of parentheses can automatically be called instantly. Unless you assigned it to a variable, there would be no other way to call it. This avoids creating a variable in memory and just calls the function at runtime.

Here's a micro-tutorial for those who never heard of closures:

Suppose we have a function

function sayHi() { alert('Hello'); }

We would call this function by doing this:

sayHi();

The above is whats called a named function, if you don't know what that means, then it's what you think of when you hear the word function

In some languages you don't have to name a function, you can leave it blank like so:

alert('Sup');
function() {alert('Hello'); }
3 + 1;
alert('Peace');

Line 2 is perfectly valid. Of course line 2 won't really do anything in your page, just like line 3 doesn't do anything. That is called an anonymous function. Now just like we can assign a variable to line 3 like:

result = 3 + 1;

We can do the same with line 2, like this:

myFunc = function() { alert('Hello'); };

And we can use myFunc as a function like the sayHi() function before. We call it just like we call sayHi()

sayHi();
myFunc();

Now since javascript is written to be versatile, where stuff like [0, 1, 2].indexOf(1) works, we can do the following:

func = function() { alert('hello'); };
func();
(function() { alert('hello'); })();

And line 1 & 2 will acplish the same thing as line 3 since line 3 is just an expanded version of line 1 and 2. The advantage of line 3 is that if someone later on in the code uses a func variable it wouldn't cause a problem with your own code, also any variables declared in line 3's function (with a var keyword) won't be a valid variable outside of your function, which in this case is what a closure is.

本文标签: javascriptpurpose of quot(function() quot at the start of scripts (GreaseMonkey only)Stack Overflow