2014-02-10 41 views
0

我在MDN(Mozilla開發者網絡)的JavaScript教程中遇到了這段代碼(順便說一句,這是一篇精彩的文章)。 MDN JavaScript Re-introduction在JavaScript中調用函數的屬性?

function personFullName() { 
    return this.first + ' ' + this.last; 
} 
function personFullNameReversed() { 
    return this.last + ', ' + this.first; 
} 
function Person(first, last) { 
    this.first = first; 
    this.last = last; 
    this.fullName = personFullName; 
    this.fullNameReversed = personFullNameReversed; 
} 

什麼讓我感興趣的是函數的調用方式。典型的();不用於在Person函數中進行函數調用。在該人的功能,我們可以看到:

this.fullName = personFullName; 

使用的

this.fullName = personFullName(); 

在此相反,「personFullName」用於像變量或屬性,而不是,它確實是,一功能。有人可以闡明這是爲什麼嗎?

+2

因爲函數沒有在那裏調用。把'alert('foo')'放在任何函數中,看看它沒有出現 – zerkms

+1

它被用作變量,因爲它*是一個變量。它是一個引用函數對象的變量。函數是可以像任何其他對象一樣分配給變量和屬性的對象。 –

回答

1

運行函數Person時,不會調用函數,只傳遞參考。


JavaScript有功能一等公民這意味着功能是其他事物一樣一個對象:他們可以有屬性,可以將它們保存在一個變量,它們可以作爲參數等

傳遞

這使得一些真正表達的代碼,看看這個:

function isEven(item) { 
return item % 2 == 0; 
} 

alert([1, 2, 3, 4, 5, 6].filter(isEven)); 

Demo

首先創建一個函數並將其保存在名爲isEven的變量中,之後我們將函數傳遞給Array.filter,以便萬一將每個元素傳遞到該數組並返回一個只包含isEven返回true的元素的數組。

+1

我明白了。對於任何仍然有疑問的人,請看下面的[JSFiddle](http://jsfiddle.net/XE48Q/)以瞭解其差異。謝謝!! –

1

JavaScript是一種功能性語言,功能是一流的值。它們只是對象,可以像任何其他對象一樣保存自定義屬性。而且對它們的引用可以自由傳遞,這允許大量的cool stuff(你可能會在後面學習)。

所以這裏發生的事情是這些函數確實沒有被調用,它們通過持有它們的變量被引用,並作爲屬性被分配給實例(this)。

如同在第一示例中,在使用一個對象(makePerson),它們現在可以稱爲上的每個實例的方法:

var s = new Person("Simon", "Willison"); 
s.fullName(); // Simon Willison 

所附文本解釋,以及:

每次我們創建一個人物時,我們都會在其中創建兩個全新的 函數對象 - 如果此代碼共享 會不會更好?

[現在您引用的代碼是]更好:我們只創建一次函數 函數,並在 構造函數中爲它們分配引用。

相關問題