學(xué)習(xí)內(nèi)容來(lái)自:《JavaScript高級(jí)程序設(shè)計(jì)(第三版)》
正文:我們知道,在js中,函數(shù)實(shí)際上是一個(gè)對(duì)象,每個(gè)函數(shù)都是Function類型的實(shí)例,并且都與其他引用類型一樣具有屬性和方法。因此,函數(shù)名實(shí)際上是指向函數(shù)對(duì)象的指針,不與某個(gè)函數(shù)綁定。在常見的兩種定義方式(見下文)之外,還有一種定義的方式能更直觀的體現(xiàn)出這個(gè)概念:
var sum = new Function("num1", "num2", "return num1 + 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è)概念。
?。ㄒ唬﹋s函數(shù)沒(méi)有重載的概念
說(shuō)到重載的概念,我們來(lái)類比Java中的重載是怎么實(shí)現(xiàn)的:在Java中,方法是通過(guò)方法簽名來(lái)唯一標(biāo)識(shí)一個(gè)方法。方法簽名包括:方法名、參數(shù)數(shù)量、參數(shù)順序和參數(shù)類型這幾個(gè)要素。因此兩個(gè)方法的方法名相同,而其他簽名要素不同,編譯器就會(huì)認(rèn)為是兩個(gè)不同方法,從而可以存在同名的不同方法,以實(shí)現(xiàn)重載的概念。(引用:怎么深入理解js中為什么沒(méi)有重載呢--segmentfault 中manxisuo的回答)。