在js中,函數實際上是一個對象,每個函數都是Function類型的實例,並且都與其他引用類型一樣具有屬性和方法。 因此,函數名稱其實是指向函數物件的指針,不與某個函數綁定。在常見的兩種定義方式(見下文)之外,還有一種定義的方式能更直觀的體現出這個概念:
var sum = new Function("num1", "num2", "return num1 + num2"); //不推荐
Function的建構函數可以接收任意數量的參數,但最後一個參數總是被看做函數體。這種方式有個缺點是,會導致解析兩次程式碼,第一次是基礎的ES程式碼解析,第二次是解析傳入建構函數中的字串,這樣會導致效能的下降,在此寫出是幫助理解js中函數其實是物件這個概念。
(一)js函數沒有重載的概念
說到重載的概念,我們來類比Java中的重載是怎麼實現的:在Java中,方法是透過方法簽名來唯一標識一個方法。方法簽名包括:方法名稱、參數數量、參數順序和參數類型這幾個要素。因此兩個方法的方法名稱相同,而其他簽章要素不同,編譯器就會認為是兩個不同方法,因此可以存在同名的不同方法,以實現重載的概念。 (引用:怎麼深入理解js中為什麼沒有重載呢--segmentfault 中manxisuo的回答)。
而上面我們說過,js中的函數名實際上是指向函數對象的指針,因此函數名可以說是一個函數的唯一標識,跟參數列表並沒有關係,因此並不會出現同名的兩個函數(因為一個指標同時只能指向一個物件)從而不存在重載的概念。 舉個栗子:
function sum(num1, num2){ return num1 + num2; } function sum(num1, num2, num3){ return num1 + num2 + num3; }
上面這種可以換一種寫法,會比較直觀一些:
##
var sum = function(num1, num2){ return num1 + num2; } sum = function(num1, num2, num3){ return num1 + num2 + num3; }
(二)函數宣告和函數表達式的差異
我們知道,常用的定義函數方法有兩個:函數宣告和函數表達式。 函數聲明,可以說是最常見的定義方法,如下例:function sum(num1, num2){ return num1 + num2; }
sum = function(num1, num2){ return num1 + num2; };
上述兩種定義方法幾乎是相同的,但有一點小區別,請看下面這個例子:
#
//函数声明 alert(sum(100, 100)); function sum(num1, num2){ return num1 + num2; } //函数表达式 alert(sum(100, 100)); var sum = function(num1, num2){ return num1 + num2; };
以上是javascript中函數定義以及宣告和表達式區別實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!