轉自:http://blog.csdn.net/hongmin118/article/details/4584023
我們在一些JS代碼中經常可以看到這樣的用法 :
(function(){})();
那這些括號是做什么用的呢?
下面我們來測試一下就知道了
(function(){alert('zol');});
運行后,沒有反映(相當於第一函數)
(function(){alert('zol');})();
運行后,彈出 zol
(function(){alert('zol');})(alert('wiki'));
運行后,先彈出wiki,再彈出zol
(function(){alert('zol');})(alert('wiki'););
出錯,什么也不運行。
我們從第二個可以看出,第一個括號中的匿名函數執行了,說明第二個括號是用於執行操作,這和我們調用函數的用法一樣,比如定義了一個function a(){};我們調用a這個函數是 a();那么a就和這個例子中的第一個括號代表的意思相同,是一個函數體,只是沒有名字,我們也叫他匿名函數。
第三個代碼中先彈wiki,說明alert('wiki')是先執行,這個是做為第一個括號的函數的參數來運行了,如果給參數后加分號,當然就出錯了,所以第四個代碼就不運行了。
==================華麗的分隔符========================================
轉自:http://segmentfault.com/q/1010000000117476
一般看JQuery插件里的寫法是這樣的
(function($) { //... })(jQuery);
今天看到bootstrap的javascript組件是這樣寫的
!function( $ ){ //... }( window.jQuery );
為什么要在前面加一個 " ! " 呢?
我們都知道,函數的聲明方式有這兩種
function fnA(){alert('msg');}//定義函數 var fnB = function(){alert('msg');}//匿名函數
樓主問題中出現的兩個函數,都是匿名函數。通常,我們調用一個方法的方式就是 FunctionName()
但是,如果我們嘗試為一個“定義函數”末尾加上(),解析器是無法理解的。
function msg(){ alert('message'); }();//解析器是無法理解的
定義函數的調用方式應該是 msg() ; 那為什么將函數體部分用()包裹起來就可以了呢?
原來,使用括號包裹定義函數體,解析器將會以函數表達式的方式去調用定義函數。也就是說,任何能將函數變成一個函數表達式的作法,都可以使解析器正確的調用定義函數。而 ! 就是其中一個,而 + - || 都有這樣的功能。
另外,用 ! 可能更多的是一個習慣問題,不同的運算符,性能是不同的。
這些有一篇非常詳細的文章,推薦閱讀:http://www.swordair.com/blog/2011/10/...