JavaScript 中每個函數都是對象,是Function()類型的執行個體。
一、定義函數的三種方式:
①函數申明方式
function sum (sum1,sum2 )
{
return sum1+sum2;
}
②函數表達式方式
var sum = function(sum1,sum2 )
{
return sum1+sum2;
}; //注意分号
③構造函數方式
var sum = new Function{"sum1","sum2", "return sum1+sum2"}; //不推薦使用,最後一個參數始終被看做函數體。此文法會導緻兩次
解析代碼,影響性能。
注意:函數名是指向函數對象的指針,和其他對象名一樣,調用函數時不用圓括号是引用函數對象,而帶了圓括号是調用函數執 行後的結果。
二、JS中無函數重載
C++允許在同一範圍中聲明幾個功能類似的同名函數,但是這些同名函數的形式參數(指參數的個數、類型或者順序)必須不同,也就是說用同一個運算符完成不同的運算功能。這就是重載函數。重載函數常用來實作功能類似而所處理的資料類型不同的問題。
但是在JS中不支援函數重載,即重複定義同名函數不論參數形式是否相同,後定義的都将覆寫先定義的。
三、函數申明與函數表達式的差別
本人認為可簡單概括為一點,即函數申明方式會發生函數申明提升過程(将函數提升到本作用域頂端),而函數表達式方式定義的函數将不會被提升。
具體表現為在同一作用域中先調用函數,後以函數申明方式定義函數,則調用代碼正常執行;若在前面調用,後面的代碼中以函數表達式方式定義函數,則執行出錯,not a function(變量提升,但函數體未提升,是以能找到變量,但無法識别它是函數)。
四、可以把一個函數作為另一個函數的參數傳遞,也可以把一個函數當做另一個函數的傳回值。
五、函數的内部屬性(對象)
①arguments對象,包含參數數組和callee屬性,在函數中arguments.callee()等同于調用函數本身,可在遞歸調用時使用。
②this對象,this引用的是函資料以執行的環境對象。在全局變量中為window。
③caller屬性,在inner函數中inner.caller屬性表示調用inner函數的父函數,可用于輸出父函數源碼, alert(inner.caller);
六、函數的屬性和方法
屬性:length,傳回函數接收到參數的個數 ;
prototype是儲存執行個體方法的真正所在,如全局方法toString() ,valueOf ()等方法都儲存在prototype 中,
隻是調用時通過各自對象的執行個體通路。
方法:apply()和call( )方法,第一個參數都是接收"在其中運作函數的作用域",即此參數指派給this,可以用來改變this的值。
apply第二個參數用來接收arguments(父函數傳入的參數對象)或者Array()執行個體 。而call,可以後接多個參數,多個
傳參必須一個一個用逗号隔開傳入,不能像apply( )傳參。
bind(o)方法建立一個執行個體,this綁定到傳入的對象參數(o)上。