我們知道,在js中,函數(shù)實(shí)際上是一個(gè)對(duì)象,每個(gè)函數(shù)都是function函數(shù)類型的實(shí)例,并且都與其他引用類型一樣具有屬性和方法。因此,函數(shù)名實(shí)際上是指向函數(shù)對(duì)象的指針,不與某個(gè)函數(shù)綁定。在常見的兩種定義方式(見下文)之外,還有一種定義的方式能更直觀的體現(xiàn)出這個(gè)概念。
function函數(shù)——function函數(shù)的載重概念
varsum=newFunction(“num1″,”num2″,”returnnum1+num2”);//不推薦
Function的構(gòu)造函數(shù)可以接收任意數(shù)量的參數(shù),但最后一個(gè)參數(shù)始終被看做函數(shù)體。這種方式有個(gè)缺點(diǎn)是,會(huì)導(dǎo)致解析兩次代碼,第一次是基礎(chǔ)的ES代碼解析,第二次是解析傳入構(gòu)造函數(shù)中的字符串,這樣會(huì)導(dǎo)致性能的下降,在此寫出是幫助理解js中函數(shù)其實(shí)是對(duì)象這個(gè)概念。
說到重載的概念,我們來類比Java中的重載是怎么實(shí)現(xiàn)的:在Java中,方法是通過方法簽名來唯一標(biāo)識(shí)一個(gè)方法。方法簽名包括:方法名、參數(shù)數(shù)量、參數(shù)順序和參數(shù)類型這幾個(gè)要素。因此兩個(gè)方法的方法名相同,而其他簽名要素不同,編譯器就會(huì)認(rèn)為是兩個(gè)不同方法,從而可以存在同名的不同方法,以實(shí)現(xiàn)重載的概念。(引用:怎么深入理解js中為什么沒有重載呢–segmentfault中manxisuo的回答)。
而上面我們說過,js中的函數(shù)名實(shí)際上是指向函數(shù)對(duì)象的指針,因此函數(shù)名可以說是一個(gè)函數(shù)的唯一標(biāo)識(shí),跟參數(shù)列表并沒有關(guān)系,因此并不會(huì)出現(xiàn)同名的兩個(gè)函數(shù)(因?yàn)橐粋€(gè)指針同時(shí)只能指向一個(gè)對(duì)象)從而不存在重載的概念。
Javascriptfunction關(guān)鍵字
在腳本語言javascript中,function是定義一個(gè)函數(shù)的關(guān)鍵字,通常形態(tài)是
function函數(shù)名(參數(shù)1[參數(shù)2])
{
函數(shù)體
return返回值
}
其中也可以不返回值。
Function函數(shù)是包含在Function和EndFunction語句之間的一組VBScript語句。Function函數(shù)與Sub過程類似。但Function函數(shù)可以有返回值??梢允褂脜?shù)。如果Function函數(shù)沒有任何參數(shù),則Function語句必須要包含空括號(hào)。Function函數(shù)通過函數(shù)名返回一個(gè)值。返回值的數(shù)據(jù)類型是Variant.
在代碼開始執(zhí)行之前,解析器就已經(jīng)通過一個(gè)名為函數(shù)聲明提升的過程,讀取并將函數(shù)聲明添加到執(zhí)行環(huán)境中。簡單來說,解析器會(huì)先將函數(shù)聲明放在源代碼樹的頂部。如果大家還想了解更多與之有關(guān)的信息,歡迎關(guān)注我們優(yōu)詞網(wǎng)的官網(wǎng)。