經常談論起函數和方法,也常常搞不清楚它們之間的界限,經常把兩個混用。首先來看看,兩者是如何定義的?
函數(function)是可以執行的javascript代碼塊,由javascript程序定義或javascript實現預定義。函數可以帶有實際參數或者形式參數,用於指定這個函數執行計算要使用的一個或多個值,而且還可以返回值,以表示計算的結果。
方法(method)是通過對象調用的javascript函數。也就是說,方法也是函數,只是比較特殊的函數。假設有一個函數是fn,一個對象是obj,那么就可以定義一個method:
obj.method = fn; obj.method(); //定義之后的調用
雖然區別對待函數和方法比較有用,但實際比較起來,它們之間並沒有想象中那么大的差別。這樣講吧,函數是可以用函數直接量定義,也就是函數可以直接儲存在變量之中,因為函數和字符串、數值一樣也是數據類型。假如儲存函數的變量是全局變量,也即是window對象的一個屬性。因此,當你調用這個函數時,實際上也是調用window對象的一個方法。所以在函數和方法之間並沒有技術上的區別,真正的差別在於設計和目的,方法是用來對this對象進行操作的,this對象是方法的一個重要屬性,當this對象出現在方法主體內部,this值就指向調用該方法的對象。而函數通常是獨立的,並不需要經常使用this對象。
下面有個例子展示方法的使用:
function Rect(w, h){ //使用this對象,避免自己調用自己 this.width = w; this.height = h; } function area(){ return this.width * this.height; } var r = new Rect(4, 5); r.area = area; //將函數賦值給對象的屬性,來定義方法 var result = r.area(); //20
當然,這個例子只是用來說明問題,並非優雅高效的代碼。也正因方法存在的各種缺點,才引入了原型對象。