1458

I found this code:

!function () {}();

What is the purpose of the exclamation mark here?

E_net4
  • 27,810
  • 13
  • 101
  • 139
Sebastian Otto
  • 15,139
  • 4
  • 18
  • 21
  • 4
    related: [JavaScript plus sign in front of function name](http://stackoverflow.com/q/13341698/1048572) – Bergi Aug 20 '14 at 11:39
  • 1
    We calling it [**Self-executing anonymous function**](http://benalman.com/news/2010/11/immediately-invoked-function-expression/) --- – befzz Jun 12 '15 at 19:58
  • 11
    @befzz Better to refer to this as an Immediately Invoked Function Expression, as that article later explains ("self-executing" implies recursion) – Zach Esposito Aug 22 '15 at 16:03
  • The exclamation mark does not in and of itself indicate an IIFE. Nor does an IIFE imply recursion. The exclamation mark merely indicates that you don't care about the returned value. The proper signature is `!(()=>{})();` or `!(function() {})();` – code_monk Jun 08 '22 at 15:13

8 Answers8

2415

JavaScript syntax 101: here is a function declaration:

function foo() {}

Note that there’s no semicolon; this is just a function declaration. You would need an invocation, foo(), to actually run the function.

Now, when we add the seemingly innocuous exclamation mark: !function foo() {} it turns it into an expression. It is now a function expression.

The ! alone doesn’t invoke the function, of course, but we can now put () at the end: !function foo() {}(), which has higher precedence than ! and instantly calls the function.

function foo() {}() would be a syntax error because you can’t put arguments (()) right after a function declaration.

So what the author is doing is saving a byte per function expression; a more readable way of writing it would be this:

(function(){})();

Lastly, ! makes the expression return a boolean based on the return value of the function. Usually, an immediately invoked function expression (IIFE) doesn’t explicitly return anything, so its return value will be undefined, which leaves us with !undefined which is true. This boolean isn’t used.

Sebastian Simon
  • 18,263
  • 7
  • 55
  • 75
Neil
  • 54,642
  • 8
  • 60
  • 72
  • 88
    +1 This is the only answer that actually addresses WHY you would want to do this, and why one sees it used more than the negation of the return result would seem to warrant. The unary operator ! (also ~, - and +) disambiguates from a function declaration, and allows the parens at the end () to invoke the function in-place. This is often done to create a local scope / namespace for variables when writing modular code. – Tom Auger Sep 28 '11 at 18:34
  • Why do you need to wrap a block of code into a function to execute it? Why instead of `(function(){alert('bla');)})();` one can't simply write `alert('bla');`? – Andrew Savinykh May 29 '12 at 21:00
  • 1
    @zespri As Tom says, "This is often done to create a local scope / namespace for variables when writing modular code." – Neil May 29 '12 at 23:58
  • 90
    Another benefit is that ! causes a semi-colon insertion, so it's impossible for this version to be wrongly concatenated with a file that doesn't end with a ;. If you have the () form, it would consider it a function call of whatever was defined in the previous file. Tip of the hat to a co-worker of mine. – Jure Triglav Nov 13 '12 at 20:31
  • 1
    One more benefit - since there is literally no reason to do `!function` or `}()` other than an iife it makes it easy to scrape them out of code if need be. Not a major thing, but I've used that fact a few times. – George Mauer Jul 30 '13 at 22:09
  • 2
    One downside is that ! forces a return value. Sometimes this matters, sometimes it does not - but if you happen to need to test the return value from the function and "undefined" is a valid possibility, you best not use the ! convention and instead use ({})() since it can return undefined. Consider: var foo = !function(bar){}("bat");console.log("foo:",foo);//=>true Verses: var foo = (function(bar){})("bat");console.log("foo:",foo);//=>undefined – Carnix Oct 02 '13 at 20:32
  • 7
    @Carnix `var foo =` breaks the statement/expression ambiguity and you can simply write `var foo = function(bar){}("baz");` etc. – Neil Oct 08 '13 at 10:49
  • 10
    this is ugly to see... The long way round is not too long to choose the exclamation mark. This way could save to the developer a fraction of a second, and hours to understand to others. – Pablo Ezequiel Leone May 29 '14 at 17:00
  • 3
    @PabloEzequielLeoneSignetti: It has nothing to do with the length of the code irrespective of the spurious claim made in this answer. It's about using an operator that is not overridden for multiple purposes that can be interpreted different ways depending on its surrounding code. The `!` is a prefix unary operator, and will only ever be interpreted as that. I doubt it would take any competent developer "hours to understand" this. – cookie monster Aug 30 '14 at 18:30
  • 3
    The "more readable" version is no more readable nor simpler to understand for someone who has never seen it before, which is why there are so many questions on SO asking what `(function(){})()` means. – cookie monster Aug 30 '14 at 18:31
  • `function foo() {}` is not a statement. It's a declaration. Though some implementations incorrectly allow it to be used as a statement in some cases. The `!function foo() {};` is an expression statement. –  Dec 31 '14 at 19:00
  • 1
    jslint says, the proper way to do it is `(function (){}());` – totten Jul 30 '15 at 14:27
  • 15
    This is usually done by minification/uglification scripts, where every single byte counts. – Dima Slivin Oct 04 '15 at 10:31
  • The precedence rule you mention is unrelated or rather symptomatic to why this works the way it does. Better answer is the one by @Michael Burr right below – Fotios Basagiannis Dec 16 '16 at 20:52
  • 4
    this is not part of 101 though – user1336321 Dec 24 '17 at 17:13
  • 1
    Interestingly, the current google closure compiler will complain with `WARNING - [JSC_USELESS_CODE] Suspicious code. The result of the 'not' operator is not being used.` – Nagev Sep 28 '22 at 14:59
  • Wow! I am amazed how back in the day, we programmers were always told to be as clear and well documented with our coding as possible; JavaScript seems to be the great exception to the rule. Do many of you out there require one-time immediate function invocations often? However, this did answer my question, however. It was excellent! – S.E. Foulk Nov 03 '22 at 20:59
  • Seeing this thread so long shows that so many people knew or used this before !! Why would I do this instead of ((parameter)=>{ // do something; } ) ( ) self invocation function ??Is there any advantage of this way of writing code !! can we use this function defined with ! function(){ }( ) ?? – Pravin Poudel Dec 15 '22 at 03:57
418

The function:

function () {}

returns nothing (or undefined).

Sometimes we want to call a function right as we create it. You might be tempted to try this:

function () {}()

but it results in a SyntaxError.

Using the ! operator before the function causes it to be treated as an expression, so we can call it:

!function () {}()

This will also return the boolean opposite of the return value of the function, in this case true, because !undefined is true. If you want the actual return value to be the result of the call, then try doing it this way:

(function () {})()
benekastah
  • 5,651
  • 1
  • 35
  • 50
Michael Burr
  • 333,147
  • 50
  • 533
  • 760
  • 22
    this is the **only** answer that explains case in the question, bravo! – Andrey Sep 20 '10 at 21:36
  • 15
    Your second code sample isn't valid JavaScript. The purpose of the `!` is to turn the function declaration into a function expression, that's all. – Skilldrick Sep 30 '11 at 08:28
  • 8
    @Andrey The bootstrap twitter uses this in all there javascript (jQuery) plugin files. Adding this comment just in case others might also have the same question. – Anmol Saraf Aug 20 '12 at 18:07
  • 2
    d3.js also uses the `!function` syntax – Kristian Mar 31 '14 at 22:01
  • 1
    @Andrey - The time that I have seen this was in minimized code, where saving that one extra byte is a win. – Mike Hedman Aug 27 '14 at 20:10
  • "_If you want the actual return value to be the result of the call, then try doing it this way: `(function () {})()`_". Why does that work like that? Thanks, I know this is from forever ago.. – 1252748 Aug 30 '14 at 18:49
  • 1
    @thomas That snippet of code is simply shorthand for declaring a function and then calling it. So rather than `function myFunction(){}; myFunction();` you can just say `(function () {})()`. This works because function names are optional and putting brackets around a function declaration make that function an expression, i.e. allow it to be immediately invoked. I know your question is now from forever ago – Ronnie Mar 08 '16 at 15:18
  • 1
    @Ronnie heheh yeah this snippet is far less mystifying to me than it was in 2014, but thanks for following up! – 1252748 Mar 08 '16 at 15:24
  • @thomas I've just realised its not really accurate to say function names are optional. They are required for non-anonymous functions, and for anonymous functions, although they are optional, their inclusion is redundant. – Ronnie Mar 08 '16 at 15:26
78

There is a good point for using ! for function invocation marked on airbnb JavaScript guide

Generally idea for using this technique on separate files (aka modules) which later get concatenated. The caveat here is that files supposed to be concatenated by tools which put the new file at the new line (which is anyway common behavior for most of concat tools). In that case, using ! will help to avoid error in if previously concatenated module missed trailing semicolon, and yet that will give the flexibility to put them in any order with no worry.

!function abc(){}();
!function bca(){}();

Will work the same as

!function abc(){}();
(function bca(){})();

but saves one character and arbitrary looks better.

And by the way any of +,-,~,void operators have the same effect, in terms of invoking the function, for sure if you have to use something to return from that function they would act differently.

abcval = !function abc(){return true;}() // abcval equals false
bcaval = +function bca(){return true;}() // bcaval equals 1
zyxval = -function zyx(){return true;}() // zyxval equals -1
xyzval = ~function xyz(){return true;}() // your guess?

but if you using IIFE patterns for one file one module code separation and using concat tool for optimization (which makes one line one file job), then construction

!function abc(/*no returns*/) {}()
+function bca() {/*no returns*/}()

Will do safe code execution, same as a very first code sample.

This one will throw error cause JavaScript ASI will not be able to do its work.

!function abc(/*no returns*/) {}()
(function bca() {/*no returns*/})()

One note regarding unary operators, they would do similar work, but only in case, they used not in the first module. So they are not so safe if you do not have total control over the concatenation order.

This works:

!function abc(/*no returns*/) {}()
^function bca() {/*no returns*/}()

This not:

^function abc(/*no returns*/) {}()
!function bca() {/*no returns*/}()
S.S. Anne
  • 15,171
  • 8
  • 38
  • 76
dmi3y
  • 3,482
  • 2
  • 21
  • 32
  • 3
    Actually, those other symbols do not have the same effect. Yes, they allow you to call a function as described, but they are not identical. Consider: var foo = !function(bar){ console.debug(bar); }("bat"); No matter what which of your symbols you put in front, you get "bat" in your console. Now, add console.debug("foo:",foo); -- you get very different results based on what symbol you use. ! forces a return value which isn't always desirable. I prefer the ({})() syntax for clarity and accuracy. – Carnix Oct 02 '13 at 20:28
  • 1
    @Carnix `!` does not force a return value; it negates it. If nothing is explicitly returned, functions return `undefined`. – Unmitigated Aug 22 '23 at 04:46
  • !function(){ logic...} is shorthand for (function(){ logic... } )() - also known as an IIFE (immediately invoked function expression). That was 10 years ago so I can't remember exactly what I was thinking, but it looks like I was saying "forces a return value" to mean - immediately invokes the function. Back then I probably just couldn't remember the term IIFE :D In any case, !function doesn't negate anything - that operator does negate in other contexts, just not in this one. Sorry my ten year younger self wasn't more articulate :D – Carnix Aug 24 '23 at 22:03
33

It returns whether the statement can evaluate to false. eg:

!false      // true
!true       // false
!isValid()  // is not valid

You can use it twice to coerce a value to boolean:

!!1    // true
!!0    // false

So, to more directly answer your question:

var myVar = !function(){ return false; }();  // myVar contains true

Edit: It has the side effect of changing the function declaration to a function expression. E.g. the following code is not valid because it is interpreted as a function declaration that is missing the required identifier (or function name):

function () { return false; }();  // syntax error
RobG
  • 142,382
  • 31
  • 172
  • 209
gilly3
  • 87,962
  • 25
  • 144
  • 176
  • 7
    For the sake of clarity for readers who may want to use an assignment with an immediately invoked function your example code `var myVar = !function(){ return false; }()` could omit the `!` like `var myVar = function(){ return false; }()` and the function will execute correctly and the return value will be untouched. – Mark Fox Mar 11 '13 at 00:55
  • 1
    To be clear, you can use it once to coerce to Boolean, because it's a *logical not* operator. !0 = true, and !1 = false. For JavaScript minification purposes, you'd want to replace `true` with `!0` and `false` with `!1`. It saves 2 or 3 characters. – Triynko Jul 26 '15 at 01:07
18

It's just to save a byte of data when we do javascript minification.

Consider the anonymous function below:

    function (){}

To make the above a self invoking function, we would generally change the above code to:

    (function (){}())

Now we added two extra characters: ( and), apart from adding () at the end of the function, which is necessary to call it. In the process of minification we generally focus on reducing the file size. So we can also write the above function as:

    !function (){}()

Both are still self invoking functions and we save a byte as well. Instead of 2 characters (,) we just used one character !.

Nagev
  • 10,835
  • 4
  • 58
  • 69
Varatharaj
  • 688
  • 6
  • 12
10

Exclamation mark makes any function always return a boolean.
The final value is the negation of the value returned by the function.

!function bool() { return false; }() // true
!function bool() { return true; }() // false

Omitting ! in the above examples would be a SyntaxError.

function bool() { return true; }() // SyntaxError

However, a better way to achieve this would be:

(function bool() { return true; })() // true
Arsen Khachaturyan
  • 7,904
  • 4
  • 42
  • 42
oozzal
  • 2,441
  • 23
  • 21
  • 6
    This is incorrect. `!` changes the way the runtime parses the function. It makes the runtime treat the function as a function expression (and not a declaration). It does this to enable the developer to immediately invoke the function using the `()` syntax. `!` will also apply itself (ie negation) to the result of invoking the function expression. – Ben Aston Jan 23 '20 at 19:27
5

! is a logical NOT operator, it's a boolean operator that will invert something to its opposite.

Although you can bypass the parentheses of the invoked function by using the BANG (!) before the function, it will still invert the return, which might not be what you wanted. As in the case of an IEFE, it would return undefined, which when inverted becomes the boolean true.

Instead, use the closing parenthesis and the BANG (!) if needed.

// I'm going to leave the closing () in all examples as invoking the function with just ! and () takes away from what's happening.

(function(){ return false; }());
=> false

!(function(){ return false; }());
=> true

!!(function(){ return false; }());
=> false

!!!(function(){ return false; }());
=> true

Other Operators that work...

+(function(){ return false; }());
=> 0

-(function(){ return false; }());
=> -0

~(function(){ return false; }());
=> -1

Combined Operators...

+!(function(){ return false; }());
=> 1

-!(function(){ return false; }());
=> -1

!+(function(){ return false; }());
=> true

!-(function(){ return false; }());
=> true

~!(function(){ return false; }());
=> -2

~!!(function(){ return false; }());
=> -1

+~(function(){ return false; }());
+> -1
SoEzPz
  • 14,958
  • 8
  • 61
  • 64
5

Its another way of writing IIFE (immediately-invoked function expression).

Its other way of writing -

(function( args ) {})()

same as

!function ( args ) {}();
kamal
  • 996
  • 15
  • 25
  • 1
    Well, it's not exactly the same; the 2nd form negates the result of the function call (and then throws it away, because there is no value assignment). I'd strictly prefer the more explicit `(function (args) {...})()` syntax and leave that `!function` form to minification and obfuscation tools. – Tobias Oct 16 '17 at 14:31