說起來ECMAScript中上面最有意思,我想那莫過于函數(shù)了,有意思的根源,則在于函數(shù)實際上是對象。每個函數(shù)都是Function類型的實例,而且都與其他引用類型一樣具有屬性和方法。由于函數(shù)是對象,因此函數(shù)名實際上也是一個指向函數(shù)對象的指針,不會與某個函數(shù)綁定。函數(shù)通常是使用函數(shù)聲明語法定義的,如下例子:
這與下面使用函數(shù)表達式定義函數(shù)的方式幾乎相差無幾。
以上代碼定了變量sum并將其初始化為一個函數(shù)。你們會注意到,function關鍵字后面沒有函數(shù)名。這是因為在使用函數(shù)表達式定義函數(shù)時,沒有必要使用函數(shù)名(通過變量sum既可以引用函數(shù))。另外,還要注意函數(shù)末尾有一個分號,就像聲明其他變量時一樣。
最后一種定義函數(shù)的方式是使用Function構(gòu)造函數(shù)。Function構(gòu)造函數(shù)可以接受任意數(shù)量的參數(shù),但最后一個參數(shù)始終都會被看成函數(shù)體,而前面的參數(shù)則枚舉出了新函數(shù)的參數(shù)。如下例子:
從技術角度講,這是一個函數(shù)表達式。但是,我們不推薦使用這種方法定義函數(shù), 因為這種語法會導致解析兩次代碼(第一次解析常規(guī)的ECMAScript代碼,第二次是解析傳入構(gòu)造函數(shù)中的字符串),從而影響性能。不過,這種語法對于理解“函數(shù)是對象,函數(shù)名是指針”的概念都是非常直觀的。
由于函數(shù)名僅僅是指向函數(shù)的指針,因此函數(shù)名與包含對象指針的其他變量沒有什么不同。換句話說,一個函數(shù)可能會有多個名字,如下例子:
以上代碼首先定義了一個名為sum()的函數(shù),用于求兩個值的和。然后,有聲明了變量anotherSum,并將其設置為sum()相等(將sum的值賦給anotherSum)。注意,使用不帶圓括號的函數(shù)名是訪問函數(shù)指針,而非調(diào)用函數(shù)。此時,anotherSum和sum 就指向了同一個函數(shù),因此anotherSum()也可以被調(diào)用并返回結(jié)果。即使將sum設置為null,讓它與函數(shù)“斷絕關系”,但仍然可以證明正常調(diào)用anotherSum()。
以上所述就是本文的全部內(nèi)容了,希望能夠?qū)Υ蠹覍W習javascript有所幫助。
|
新聞熱點
疑難解答
圖片精選