通常看JQuery插件裏的寫法是這樣的javascript
(function($) { //... })(jQuery);
今天看到bootstrap的javascript組件是這樣寫的java
!function( $ ){ //... }( window.jQuery );
爲何要在前面加一個 " ! " 呢?bootstrap
咱們都知道,函數的聲明方式有這兩種segmentfault
function fnA(){alert('msg');}//聲明式定義函數 var fnB = function(){alert('msg');}//函數賦值表達式定義函數
樓主問題中出現的兩個函數,都是匿名函數。一般,咱們調用一個方法的方式就是 FunctionName()函數
可是,若是咱們嘗試爲一個「定義函數」末尾加上(),解析器是沒法理解的。性能
function msg(){ alert('message'); }();//解析器是沒法理解的
定義函數的調用方式應該是 msg() ;ui
若是將函數體部分用()包裹起來就能夠運行而且解析器是不報錯的,如:url
(function($) { //... })(jQuery);
那爲何將函數體部分用()包裹起來就能夠了呢?spa
原來,使用括號包裹定義函數體,解析器將會以函數表達式的方式去調用定義函數。也就是說,任何能將函數變成一個函數表達式的做法,均可以使解析器正確的調用定義函數。而 ! 就是其中一個,而 + - || 都有這樣的功能。插件
另外,用 ! 可能更多的是一個習慣問題,不一樣的運算符,性能是不一樣的。
這些有一篇很是詳細的文章,推薦閱讀:http://www.swordair.com/blog/2011/10/...
就是爲了能省略一個字符……
// 這麼寫會報錯,由於這是一個函數定義:
function() {}() // 常見的(多了一對括號),調用匿名函數: (function() {})() // 但在前面加上一個布爾運算符(只多了一個感嘆號),就是表達式了,將執行後面的代碼,也就合法實現調用 !function() {}()
出處參考:
在前面加上~+-等一元操做符也能夠。。其實還有好幾種符合均可以保證匿名函數聲明完就當即執行
var hi = function(){ alert("hi") };
hi();
等於...
(function(){ alert("hi") })();
!、+和()同樣的效果能夠把換成
!function(){ alert("hi") }();
!比()節省一個字符,或者說比()好看些