自調用匿名函數

通常定義函數並調用 
function a(){ 

a(); 
或是 
var a = function(){ 


a(); 

但是查看jquery源碼會發現它最外層的架構是這樣的 
(function( window, undefined ) { 
// jquery code 
})(window); 

解釋:首先jquery是定義了一個匿名函數(所謂的匿名函數就是沒有名字的函數,順便說一下閉包的概念:閉包就是在一個函數內部定義一個函數指向外部函數的一個成員變量,並且內部定義的這個函數訪問外部函數中定義的臨時變量) 
,在最上面的例子中a實際上是function的一個引用,只要在函數的引用後面添加()就能讓函數執行,那可不可以直接在匿名函數後面添加()讓匿名函數執行呢 
function(){}() 
執行你會發現報錯,javascript引擎在掃描到function時會認爲這個一個函數的聲明,所以直接在後面調用()會報錯,在一個語句後面直接添加括號和一個表達式後面添加括號是兩個概念,在語句後面添加的操作符會被認爲是分組符號,分組符號內部需要傳入表達式才行,如果上面的改成function(){alert("1")}(1)就不會報錯,但是上面的函數還是不會執行,這只是相當於定義了2個毫無關係的表達式,function (){} (1);在表達式後面添加括號會讓表達式立即執行,但是如果是一個表達式後面添加()就會執行,所以 
在匿名函數外面添加()然後再在括號後面添加()就可以進行調用了 
javascript中()括起來的部分是不能包含語句的,會被當作表達式處理,所以如果function被()括起來以後就被javascript引擎作爲function表達式處理了。 

因此jquery最外層就是一個自調用匿名函數。但是他這麼做的最大原因是想定義一個命名空間,這樣就不會和全局的變量出現衝突 

下面的例子是說明()的作用,()可以強制js片段執行 
//方式1,調用函數,得到返回值。強制運算符使函數調用執行  
(function(x,y){  
  alert(x+y);  
   return x+y;  
}(3,4)); 
//方式二,調用函數,得到返回值。強制函數直接量執行再返回一個引用,引用再去調用執行  
(function(x,y){  
   alert(x+y);  
   return x+y;  
})(3,4);  

//arguments.callee([參數])被用於函數內部的遞歸調用,這種是匿名的遞歸函數 
也可以使用命名的遞歸函數,如 
function factorial (x) { 
  if (x <= 1) { 
    return 1; 
  } else { 
    return x * factorial(x-1); 




function和new Function()的區別 
var a = function (){alert(1)} 
var b = new Function('alert(1)');//大寫F 
new Function()與new Array()相似,都是用javascript自帶的功能返回一個function或者數組 
所以上面a跟b是相同的,最終都是function
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章