在Javascript定義一個函數通常有以下三種方式:html
function fnMethodName(x){alert(x);}
var fnMethodName = function(x){alert(x);}
var fnMethodName = new Function('x','alert(x);')
上面三種方法定義了同一個方法函數fnMethodName,第1種就是最經常使用的方法,後兩種都是把一個函數複製給變量fnMethodName,而這個函數是沒有名字的,即匿名函數。實際上,至關多的語言都有匿名函數。web
var f = function fact(x) { if (x < = 1) return 1; else return x*fact(x-1); };
var y = "global"; function constructFunction() { var y = "local"; return new Function("return y"); // 沒法獲取局部變量 } alert(constructFunction()()); // 輸出 "global"
和函數關鍵字定義相比Function()構造器有本身的特色且要難以使用的多,因此這項技術一般不多使用。而函數字面量表達式和函數關鍵字定義很是接近。考慮前面的區別,雖然有消息說字面量的匿名函數在OS X 10.4.3下的某些webkit的引擎下有bug,但咱們日常所說的匿名函數均指採用函數字面量形式的匿名函數。更多詳細內容能夠閱讀《JavaScript: The Definitive Guide, 5th Edition》的Functions那章。瀏覽器
昨天hedger wang在他的blog介紹了幾種匿名函數的代碼模式:ide
錯誤模式:其沒法工做,瀏覽器會報語法錯。函數
function(){ alert(1); }();
(function(){ alert(1); } ) ( );
( function(){ alert(2); } ( ) );
void function(){ alert(3); }()
這三種方式是等同的,hedger wang由於我的緣由比較喜歡第3種,而在實際應用中我看到的和使用的都是第1種。ui