函数声明方式有两种:

1,    function demo(){}  //声明式定义函数
2,     var demo=function(){} //函数赋值表达式定义函数,匿名函数

  

我们通常这样调用函数 demo()。

但如果我们为一个“定义函数”末尾加上(),解析器是无法理解的。

如果将函数体部分用()包裹起来就可以运行并且解析器是不报错的:

3,声明后立即就可以调用函数:

(function() {})()  
但在前面加上一个布尔运算符(只多了一个感叹号),就是表达式了,将执行后面的代码,也就合法实现调用
!function() {}()

 在前面加上~+-等一元操作符也可以。。其实还有好几种符合都可以保证匿名函数声明完就立即执行

我们都知道分号是为了和前面的代码隔开,js可以用换行分隔代码,但是合并压缩多个js文件之后,换行符一般会被删掉,所以连在一起可能会出错,加上分号就保险了。

你看到的感叹号,一般是在压缩过的js文件里面,因为在匿名函数调用的时候,通常我们都是用:
(function(){})() 的形式,但也可以使用另一种形式:!function(){}() 前面的!号可以换成-+~等等一元操作符,从而省下了1字节。