11

I saw this function:

(function (x, y, data, lbl, dot) {
    // Function body...
})(x, y, data[i], labels[i], dot);

What is this? A function? Why place a function definition in ()?

Martin Tournoij
  • 26,737
  • 24
  • 105
  • 146
user285020
  • 2,913
  • 4
  • 22
  • 17
  • possible duplicate of [Is the following JavaScript construct called a Closure?](http://stackoverflow.com/questions/3872604/is-the-following-javascript-construct-called-a-closure) – Thilo Oct 13 '10 at 08:36

8 Answers8

41

In javascript you can have anonymous and self invoking functions.

function add(a, b)
{
   return a + b;
}

is same as

var add = function (a, b) {
             return a + b;
          }

and you call these as

add(10, 20)

You can define the function and call it immediately as

(
   function(a, b)
   {
      return a + b;
   }
)(10, 20);

The

   (
       function(a, b)
       {
          return a + b;
       }
    )

part defines a function, and the (10, 20) immediately after it calls the function just defined, with 10 and 20 as arguments to it.

Since the function does not have a name, it cannot be used later in the code.

The code in your question is probably minified, and creates a function in a similar way and calls it immediately.

Nivas
  • 18,126
  • 4
  • 62
  • 76
  • I dont get it....Why is the function not created like this instead::::::: function () {} (); ....why is it like (function(){})(); it is just anonymous which means no name right...I know it semicolon plays a role here...please explain if you can. – Muhammad Umer Apr 07 '13 at 04:07
  • 1
    @MuhammadUmer Yes, the difference is the name. `function x{} ();` creates a function `x` and calls it immediately. But it can be called again also, using the name: `x();`. But `(function(){})();` creates an anonymous function, calls it and after that the function cannot be used again. – Nivas Apr 07 '13 at 12:50
  • Why do I create anonymous function (never use it again) and call it immediately after defining? - Instead I could just (in this example) return 10 + 20. AND not define function to have logic of a + b and later calling it just for 10,20? – levi Feb 19 '14 at 10:36
  • Yeah, I second this. Why arguments in an IIFE? One could just hardcode the values to put in there. – cst1992 Mar 25 '16 at 20:11
7

function() {} is a definition of an anonymous function and (function() {})() is a call of that anonymous function.

This works since functions can be passed like data. So window.alert is the known alert function itself and window.alert() will call that function.

This technique is often used to keep the current variable scope clean as the function has its own variable scope.

Gumbo
  • 643,351
  • 109
  • 780
  • 844
5

It is a self anonymous invoking function. The function is defined and executed immediately. The parenthesis that wrap the function ensure that it is treated as a function expression instead of a function declaration. The final pair of parenthesis invoke the function and pass the arguments.

Daniel Vassallo
  • 337,827
  • 72
  • 505
  • 443
2

A self-executing anonymous function would be a pretty accurate description.

Jacob Relkin
  • 161,348
  • 33
  • 346
  • 320
1

It is a self invoking function, it is executed right away. Self invoking functions are effective for avoiding creation of global variables, jQuery uses this very effectively.

Q_Mlilo
  • 1,729
  • 4
  • 23
  • 26
0

The function inside the parenthesis is an anonymous function. I cannot say why this is done the way it is done, but the programmer defines and anonymous function, and calls it immediately. You could probably do the same thing by simply substituting its arguments with the values passed in, and removing the function definition.

vhallac
  • 13,301
  • 3
  • 25
  • 36
0
var funct = function(x,y) { }
funct(1,2)

is the same as

(function(x,y){ })(1,2);

it defines a self invoking anonymous function. It gets executed and then thrown away. It is a way of tidying your code (although this is a bad example) and having private variables in only that scope. It also won't get stored within the closure.

DoXicK
  • 4,784
  • 24
  • 22
-1

I figured out that

!(function (a, b) {

on poly up the math website makes it so every now and then it stops the click from working

dibi
  • 3,257
  • 4
  • 24
  • 31