讀jQuery 1.6.4源碼–Javascript的匿名函數

來源:互聯網
上載者:User
文章目錄
  • 一、什麼是匿名函數?
  • 二、函數字面量和Function()建構函式的區別
  • 三、匿名函數的代碼模式

為什麼jQuery.js原始碼中的第一個有效字元是個左括弧?這個左括弧在9000多行的代碼中與哪個匹配?起到什麼作用?

相關的說明如下:

A、括弧的範圍和作用

 

jQuery的源碼幾乎都在下面的代碼中:

(                     //第一個括弧開始  function() {    //.....  })(/**第二個括弧**/)

 

第一個括弧裡面是個匿名函數,第二個括弧表示馬上執行第一個括弧裡面的代碼。
首先,javascript裡面是沒有命名空間的,要保證javascript函數、對象與其他的不衝突,這裡用了javascript的一個技巧:所有javascript函數、對象都在一個匿名函數裡面定義,確保了所定義的函數、對象的有效範圍,起到了命名空間的作用,避免名字衝突。

 

B、Javascript的匿名函數

一、什麼是匿名函數?

在Javascript定義一個函數一般有如下三種方式:

  1. 函數關鍵字(function)語句

    function fnMethodName(x){alert(x);}
  2. 函數字面量(Function Literals)
    var fnMethodName = function(x){alert(x);}
  3. Function()建構函式
    var fnMethodName = new Function('x','alert(x);')

上面三種方法定義了同一個方法函數fnMethodName,第1種就是最常用的方法,後兩種都是把一個函數複製給變數fnMethodName,而這個函數是沒有名字的,即匿名函數。

 

二、函數字面量和Function()建構函式的區別
  1. 雖然函數字面量是一個匿名函數,但文法允許為其指定任意一個函數名,當寫遞迴函式時可以調用它自己,使用Function()建構函式則不行。

    var f = function fact(x) {  if (x < = 1) return 1;  else return x*fact(x-1);};
  2. Function()建構函式允許運行時Javascript代碼動態建立和編譯。在這個方式上它類似全域函數eval()。
  3. Function()建構函式每次執行時都解析函數主體,並建立一個新的函數對象。所以當在一個迴圈或者頻繁執行的函數中調用Function()建構函式的效率是非常低的。相反,函數字面量卻不是每次遇到都重新編譯的。
  4. 用Function()建構函式建立一個函數時並不遵循典型的範圍,它一直把它當作是頂級函數來執行。
    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那章。

 

三、匿名函數的代碼模式

錯誤模式:其無法工作,瀏覽器會報文法錯。

function(){  alert(1);}();
  1. 函數字面量:首先聲明一個函數對象,然後執行它。

    (function(){  alert(1);} ) ( );
  2. 優先運算式:由於Javascript執行運算式是從圓括弧裡面到外面,所以可以用圓括弧強制執行聲明的函數。
    ( function(){  alert(2);} ( ) );
  3. Void操作符:用void操作符去執行一個沒有用圓括弧包圍的一個單獨運算元。
    void function(){  alert(3);}()

這三種方式是等同的。

 

<以上內容部分摘自

http://dancewithnet.com/2008/05/07/javascript-anonymous-function/>

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.