2017-09-25 65 views
1

看到箭頭函數沒有this,與常規函數相比,它們缺少一個非常基本的能力:它們不能用作構造函數,因爲它們沒有上下文。JavaScript:箭頭功能是頭等功能嗎?

有鑑於此,arrow函數是否被認爲是一流的函數?

編輯:如果箭頭函數被視爲第一類函數,那麼箭頭函數的哪些屬性可以讓您仍然稱它爲一個?

回答

1

鑑於箭頭函數沒有這個功能,與常規函數相比,它們缺少一個非常基本的功能:它們不能用作構造函數,因爲它們沒有上下文。

這隻與該函數的執行有關,而不是它的類型。 A this值是執行的一個方面,而不是函數對象本身。

考慮到這一點,是否將箭頭函數視爲第一類對象?

是的,他們的數據對象,就像任何其他對象,具有獨特的差異,它們包含了可調用可執行代碼。不同類型的函數在調用方面的能力和侷限性並不影響它們是否是第一類對象。

const fn = foo => foo + 42 
 
const fn2 = fn 
 

 
console.log(fn == fn2) // true 
 

 
console.log(fn(42)) 
 
console.log(fn2(42)) 
 

 
fn.foo = "bar" 
 
console.log(fn2.foo) // "bar"


編輯:如果箭頭功能被認爲是第一類函數,什麼是箭頭的功能,允許你還是叫一個屬性?

與傳統功能的屬性相同。它們都是從Function.prototype繼承的所有對象。他們的主要區別在於他們的調用,這再次不會改變他們是否是第一類對象/函數的問題。他們可以在句法上用於任何可以使用任何其他對象的地方。

+0

@Andrew:這是一個完全不同的問題,在將一個函數類型與另一個函數類型進行比較之前,必須真正問到這個問題。基本上,它們是可以像任何其他對象一樣在語法上用作數據的對象。如果試圖使它們成爲變量,函數參數或任何其他需要值的構造的值,則解釋器/編譯器不會拋出語法錯誤。就像一個數組是一種特殊的對象值一樣,一個函數也是如此。 – llama

+0

嗯..你是什麼意思?「他們可以在任何地方使用任何其他物體可以使用的句法。」?因爲從我如何解釋這個陳述,這是不正確的,因爲它們不能用作構造函數......至少不能被正確地使用。在箭頭函數中,this是窗口/全局對象(或其上面的範圍)。你是否認爲功能改變是無關緊要的,即使它在構造函數中是不可取/錯誤的? – Andrew

+0

@Andrew:這不是一個語法問題;這是一個運行時問題(TypeError)。當我說「語法上」時,我的意思是解析器不會拋出一個SyntaxError,就像你試圖給一個變量分配一個if語句一樣。 – llama