What do empty parentheses () after a function declaration do in javascript?

Javascript

Javascript Problem Overview


I'm trying to read the Prototype source. I've come to this part.(Unfortunately, this snippet is in the beginnning).

What does this () mean?

  Browser: (function(){
    var ua = navigator.userAgent;
    var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]';
    return {
      IE:             !!window.attachEvent && !isOpera,
      Opera:          isOpera,
      WebKit:         ua.indexOf('AppleWebKit/') > -1,
      Gecko:          ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1,
      MobileSafari:   /Apple.*Mobile.*Safari/.test(ua)
    }
  })(),

I am referring to the last line before the comma?

Javascript Solutions


Solution 1 - Javascript

The code is defining an anonymous function (the (function (){ ... }) bit) and then calling it (with no arguments). It then assigns the value to the Browser property of the object that is presumably being defined outside of your code snippet.

You could also define the function somewhere:

function myFunction() {
    var ua = navigator.userAgent;
    var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]';
    return {
      IE:             !!window.attachEvent && !isOpera,
      Opera:          isOpera,
      WebKit:         ua.indexOf('AppleWebKit/') > -1,
      Gecko:          ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1,
      MobileSafari:   /Apple.*Mobile.*Safari/.test(ua)
}

and then call it:

var foo = myFunction();

and then assign the value:

...
Browser: foo,
...

One downside with doing it that way is that you "pollute your namespace" with a function and a variable that you won't use anywhere else. The second issue is that you can't use the value of any locally-scoped variables in your function definition (the anonymous function behaves as a closure).

Solution 2 - Javascript

(function () {}) creates an anonymous function.

Adding the () to the end calls the function that was just created.

In the case of this particular function, the anonymous function returns several properties to the Browser object. So, you end up with boolean values for, e.g., Browser.IE, Browser.Opera, etc.

Solution 3 - Javascript

it calls the anonymous function that was just declared, effectively causing the "block" to be evaluated.

Solution 4 - Javascript

It's a simple function call, no different than foo() except it's invoking an anonymous function literal, the result of the function is assigned to the Browser property.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTeejView Question on Stackoverflow
Solution 1 - JavascriptFrank SchmittView Answer on Stackoverflow
Solution 2 - JavascriptAndrew HedgesView Answer on Stackoverflow
Solution 3 - JavascriptcobbalView Answer on Stackoverflow
Solution 4 - Javascriptmeder omuralievView Answer on Stackoverflow