理解JavaScript函數(函數和對象的區別和聯絡)

來源:互聯網
上載者:User

原文:http://harrison2010.javaeye.com/blog/173446

函數對象和其他內部對象的關係

 

  除了函數對象,還有很多內部對象,比如:Object、Array、Date、RegExp、Math、Error。這些名稱實際上表示一個類型,可以通過new操作符返回一個對象。然而函數對象和其他對象不同,當用typeof得到一個函數對象的類型時,它仍然會返回字串“function”,而typeof一個數組對象或其他的對象時,它會返回字串“object”。下面的程式碼範例了typeof不同類型的情況:

以下是引用片段:

alert(typeof(Function)));alert(typeof(new Function()));alert(typeof(Array));alert(typeof(Object));alert(typeof(new Array()));alert(typeof(new Date()));alert(typeof(new Object())); 

  運行這段代碼可以發現:前面4條語句都會顯示“function”,而後面3條語句則顯示“object”,可見new一個function實際上是返回一個函數。這與其他的對象有很大的不同。其他的類型Array、Object等都會通過new操作符返回一個普通對象。儘管函數本身也是一個對象,但它與普通的對象還是有區別的,因為它同時也是物件建構器,也就是說,可以new一個函數來返回一個對象,這在前面已經介紹。所有typeof返回“function”的對象都是函數對象。也稱這樣的對象為構造器(constructor),因而,所有的構造器都是對象,但不是所有的對象都是構造器。

  既然函數本身也是一個對象,它們的類型是function,聯想到C++、Java等物件導向語言的類定義,可以猜測到Function類型的作用所在,那就是可以給函數對象本身定義一些方法和屬性,藉助於函數的prototype對象,可以很方便地修改和擴充Function類型的定義,例如下面擴充了函數類型Function,為其增加了method1方法,作用是彈出對話方塊顯示"function":

以下是引用片段:

Function.prototype.method1=function(){      alert("function");}function func1(a,b,c){      return a+b+c;}func1.method1();func1.method1.method1(); 

  注意最後一個語句:func1.method1.mehotd1(),它調用了method1這個函數對象的method1方法。雖然看上去有點容易混淆,但仔細觀察一下文法還是很明確的:這是一個遞迴的定義。因為method1本身也是一個函數,所以它同樣具有函數對象的屬性和方法,所有對Function類型的方法擴充都具有這樣的遞迴性質。

  Function是所有函數對象的基礎,而Object則是所有對象(包括函數對象)的基礎。在JavaScript中,任何一個對象都是Object的執行個體,因此,可以修改Object這個類型來讓所有的對象具有一些通用的屬性和方法,修改Object類型是通過prototype來完成的:

以下是引用片段:

Object.prototype.getType=function(){       return typeof(this);}var array1=new Array();function func1(a,b){      return a+b;}alert(array1.getType());alert(func1.getType()); 

  上面的代碼為所有的對象添加了getType方法,作用是返回該對象的類型。兩條alert語句分別會顯示“object”和“function”。

      將函數作為參數傳遞

  在前面已經介紹了函數對象本質,每個函數都被表示為一個特殊的對象,可以方便的將其賦值給一個變數,再通過這個變數名進行函數調用。作為一個變數,它可以以參數的形式傳遞給另一個函數,這在前面介紹JavaScript事件處理機制中已經看到過這樣的用法,例如下面的程式將func1作為參數傳遞給func2:

以下是引用片段:

function func1(theFunc){      theFunc();}function func2(){      alert("ok");}func1(func2); 

  在最後一條語句中,func2作為一個對象傳遞給了func1的形參theFunc,再由func1內部進行theFunc的調用。事實上,將函數作為參數傳遞,或者是將函數賦值給其他變數是所有事件機制的基礎。

例如,如果需要在頁面載入時進行一些初始化工作,可以先定義一個init的初始化函數,再通過window.onload=init;語句將其綁定到頁面載入完成的事件。這裡的init就是一個函數對象,它可以加入window的onload事件列表。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.