1.函數(shù)實際上是對象。
2.每個函數(shù)都是Function類型的實例北滥,而且都與其他引用類型一樣具有屬性和方法井赌。
3.由于函數(shù)是對象,因此函數(shù)名實際上也是一個指向函數(shù)對象的指針舟铜,不會與某個函數(shù)綁定戈盈。
4.函數(shù)通常是使用函數(shù)聲明語法定義的:
與使用函數(shù)表達(dá)式定義函數(shù)的方式幾乎相差無幾。
5.由于函數(shù)名僅僅是指向函數(shù)的指針谆刨,因此函數(shù)名與包含對象指針的其他變量沒有什么不同塘娶。換句話說,一個函數(shù)可能有多個名字:
注意:使用不帶圓括號的函數(shù)名是訪問函數(shù)指針痊夭,而非調(diào)用函數(shù)刁岸。
6.沒有重載(深入理解)
7.函數(shù)聲明和函數(shù)表達(dá)式:
解析器會率先讀取函數(shù)聲明,并使其在執(zhí)行任何代碼前可用(可以訪問)她我;至于函數(shù)表達(dá)式虹曙,則必須等到解析器執(zhí)行到它所在的代碼行,才會真正被解釋執(zhí)行番舆。
除了什么時候可以通過變量訪問函數(shù)這一點區(qū)別之外酝碳,函數(shù)聲明與函數(shù)表達(dá)式的語法其實是等價的。
8.因為ECMAScript中的函數(shù)名本身就是變量恨狈,所以函數(shù)也可以作為值來使用疏哗。也就是說,不僅可以像傳遞參數(shù)一樣把一個函數(shù)傳遞給另一個函數(shù)拴事,而且可以將一個函數(shù)作為另一個函數(shù)的結(jié)果返回沃斤。
可以從一個函數(shù)中返回另一個函數(shù)圣蝎,這也是極為有用的一種技術(shù) 刃宵。
9.函數(shù)內(nèi)部屬性:arguments和this
arguments:它是一個類數(shù)組對象衡瓶,包含著傳入函數(shù)中的所有參數(shù)。雖然arguments的主要用途是保存函數(shù)參數(shù)牲证,但這個對象還有一個名叫callee的屬性哮针,該屬性是一個指針,指向擁有這個arguments對象的函數(shù)坦袍。?
上面函數(shù)的問題:這個函數(shù)的執(zhí)行與函數(shù)factorial緊緊耦合在一起十厢。為了消除這種緊密耦合的現(xiàn)象,可以使用arguments.callee捂齐。
this:引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對象--或者也可以說是this值
caller:這個屬性中保存著調(diào)用當(dāng)前函數(shù)的函數(shù)的引用蛮放,如果是在全局作用域中調(diào)用當(dāng)前函數(shù),它的值為null奠宜。
注意:不能為函數(shù)的caller屬性賦值包颁。
10.函數(shù)的屬性和方法:length和prototype
length屬性:表示函數(shù)希望接收的命名參數(shù)的個數(shù)。
prototype屬性:對于ECMAScript中的引用類型而言压真,prototype是保存它們所有實例方法的真正所在娩嚼。換句話說,諸如toString()和valueOf()等方法實際上都保存在prototype名下滴肿,只不過通過各自對象的實例訪問罷了岳悟。在ECMAScript5中,prototype屬性是不可枚舉的泼差,因此使用for-in無法發(fā)現(xiàn)贵少。
每個函數(shù)都包含兩個非繼承而來的方法:apply()和call()。這兩個方法的用途都是在特定的作用域中調(diào)用函數(shù)堆缘,實際上等于設(shè)置函數(shù)體內(nèi)this對象的值滔灶。
apply()方法接受兩個參數(shù):一個是在其中運行函數(shù)的作用域,另一個是參數(shù)數(shù)組套啤。其中宽气,第二個參數(shù) 可以是Array的實例,也可以是arguments對象潜沦。
call()方法與apply()方法的作用相同萄涯,它們的區(qū)別僅在于接受參數(shù)的方式不同。對于call()方法而言唆鸡,第一個參數(shù)是this值沒有變化涝影,變化的是其余參數(shù)都直接傳遞給函數(shù)。換句話說争占,在使用call()方法的時候燃逻,傳遞給函數(shù)的參數(shù)必須逐個列舉出來序目。
它們真正強(qiáng)大的地方是能夠擴(kuò)充函數(shù)賴以運行的作用域。
bind()方法:這個方法會創(chuàng)建一個函數(shù)的實例伯襟,其this值會被綁定到傳給bind()函數(shù)的值猿涨。
11.每個函數(shù)繼承的toLocaleString()和toString()方法始終都返回函數(shù)的代碼。另外一個繼承的valueOf()方法同樣也只返回函數(shù)代碼姆怪。