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