Ajax In Action 附錄B 3.1

B3 方法和函數

我們在這本書之前的部分和滯後的部分都定義了很多函數並且調用了它們,Java或者C#程序員會認爲函數就是方法,只是用不同的標記標識而已。在這一部分中,我們來仔細地研究一下函數可以做什麼。

B3.1 一等公民--函數

函數有點像Java的方法,他們都有參數,並且在被引用的時候都有返回值,但是兩者之間有一個主要的區別,Java的方法是存在與定義它的類的內部的,不能從這個類裏面被分離出來,而JavaScript函數是一個獨立的個體,在他自己的權力範圍內,是一個一等公民(Java靜態類應該是位於這兩者之間,不屬於對象的實例,但是還是在類的定義範圍之內)。

C語言系的程序員可能會想“啊,這個跟C++裏面的函數指針很像”,確實很像,但是不完全一樣。

JavaScript中,函數是一種內置對象,像我們所期望的,它包括可執行的代碼,可以被調用,但是它也是Object的一個子孫,而且可以做JavaScript對象可以做的任何事情,比方說通過名字存儲屬性。對於函數來講,在其中定義另一個函數是再正常不過的事情了。

我們已經知道了怎樣對函數對象進行引用,更通常的情況下,我們有可能想用一行代碼來飲用一個函數,例如:

var result=MyObject.doSomething(x,y,z)

然而,函數是頭等公民,而且也可以通過方法用call()來調用:

var result=MyObject.doSomething.call(MyOtherObject,x,y,z)

甚至這樣:

var result=MyObject['doSomething'].call(MyOtherObject,x,y,z)

Function.call()的第一個參數在調用過程中作函數的上下文的對象,隨後的參數則是函數調用的參數。Apply()在第二個參數是一個數組作爲參數傳遞的時候稍微有點不一樣,在對參數長度沒有限制的時候,函數的調用具有更大的靈活性。

在這裏,需要指出的是JavaScript函數的參數是沒有長度限制的,調用比預定義參數個數多或者少的Java或者C#方法會產生一個編譯錯誤。JavaScript會忽略多出來的參數,給缺少的參數指定undifined。一個特別靈活的函數應該能通過參數屬性來訪問參數列表,賦予默認值,拋出異常,或者進行其他處理。這可以通過gettersetter方法來實現,例如:

function area(value){

if (value){

this.area=value;

}

return this.area;

}

如果我們調用area(),那麼value就是未定義的,所以什麼都不執行,我們這個函數就執行了一個getter的功能,如果有值傳進來,這個函數就是一個setter了。

函數變得很有意思,那麼就讓我們首先來利用他的獨立性吧。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章