2

I was looking for some example code for JS, and I found something that used !function() and I was wondering what exactly is the exclamation for?

Imran
  • 87,203
  • 23
  • 98
  • 131
Sean
  • 8,401
  • 15
  • 40
  • 48

5 Answers5

3

! is the boolean not operator. !function() converts the return value of function() to boolean and returns its opposite value

Imran
  • 87,203
  • 23
  • 98
  • 131
2

If you are substituting the word "function" for the name of a function, it simply means "negate the result of the function". The ! means not. So

!true == false
Chris Thompson
  • 35,167
  • 12
  • 80
  • 109
1

functionname is an expression (which presumably evaluates to a function-object) and the result of this evaluation (a function-object) is invoked with () which invokes the function and evaluates to the return value.

Now, this return value (which was the result of an expression) is then negated with the unary ! (not) operator. The rules for ! are !truthy -> false and !falsy -> true, where truthy and falsy are concepts covered "truthy and falsy" in JavaScript.

The example could be written as: !((functioname)()), but that's just silly

1

Tried this:

var a = !function () {
            alert("notfun");
            return "nottestfun";
        }

alert(a);

It alerts:

false

and nothing else. If you try to run a(), you get a type error:

Uncaught TypeError: Property 'a' of object [object DOMWindow] is not a function
mikermcneil
  • 11,141
  • 5
  • 43
  • 70
  • Because it's not. Remember that `function () {}` (in an expression context, which it is in the in example) is just returning a function-object which is being negated right away! (`var a = !someFunctionObject`) Since an object is a `truthy` value then that is the same as `var a = false` and `false()` is just silly. If you wanted to *evaluate* the function and apply `!` to that... `var a = !(function () {alert("notfun"); return "nottestfun"})(); alert(a)` -- happy coding. –  Jan 26 '11 at 03:26
0

It's a negation. So if function() returns a boolean value, the ! negates it.

Not sure how JS governs naming (the $ is legal), so it could also just be the name of the function :P (I've since checked, and it appears that since ! is an operator, it's not legal, so this is not a possibility).

Rafe Kettler
  • 75,757
  • 21
  • 156
  • 151