在阅读一些开源框架中,经常会看到如下的代码

//第一种
(function(){
........
........
........
})();
//第二种
!(function () {
........
.......
.......
})();

第一种的写法比较好理解。就相当于

var c=function(){};c();

第二种写法有点想不通。

  • 前面加了一个!是什么意思呢?(Boolean吗?)

    首先定义了一个方法

function(){alert(1);}(); //编译器会直接报错。
!function(){alert(2);}();//运行正常
+function(){alert(2);}();//运行正常
-function(){alert(2);}();//运行正常

原来,使用括号包裹定义函数体,解析器将会以函数表达式的方式去调用定义函数。也就是说,任何能将函数变成一个函数表达式的作法,都可以使解析器正确的调用定义函数。而 ! 就是其中一个,而 + - || 都有这样的功能。

所以看到!(function(){})();完全不足为奇。

个人感觉使用!function(){}();这种方式就可以少写一个() 但是给看起来不那么得体。可能会给读者带来一些困惑。所以建议使用(function(){})();这种方式。