Search code examples
javascriptsyntaxanonymous-functioniife

Location of parenthesis for auto-executing anonymous JavaScript functions?


I was recently comparing the current version of json2.js with the version I had in my project and noticed a difference in how the function expression was created and self executed.

The code used to wrap an anonymous function in parenthesis and then execute it,

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

but now it wraps the auto-executed function in parenthesis.

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

There is a comment by CMS in the accepted answer of Explain JavaScript’s encapsulated anonymous function syntax that “both: (function(){})(); and (function(){}()); are valid.”

I was wondering what the difference is? Does the former take up memory by leaving around a global, anonymous function? Where should the parenthesis be located?


Solution

  • They're virtually the same.

    The first wraps parentheses around a function to make it a valid expression and invokes it. The result of the expression is undefined.

    The second executes the function and the parentheses around the automatic invocation make it a valid expression. It also evaluates to undefined.

    I don't think there's a "right" way of doing it, since the result of the expression is the same.

    > function(){}()
    SyntaxError: Unexpected token (
    > (function(){})()
    undefined
    > (function(){return 'foo'})()
    "foo"
    > (function(){ return 'foo'}())
    "foo"