2017-06-18 46 views
-1

最近我在教程中看到了這些函數。它們是否相同?這些功能是否等同?

(_ => console.log(1))(); 

(() => console.log(1))(); 
+1

它們是等價的。兩個打印「1」到控制檯。 – Pointy

+0

但是爲什麼使用_和()作爲匿名函數,是一樣的?爲什麼使用_? – James

+1

爲簡潔起見,有時會這樣寫。它通常意味着「被忽略」。 – Ben

回答

1

這兩個功能完全一樣。唯一的區別是頂層功能需要一個參數,_,而另一個參數爲零。這個例子中沒有關係,因爲你不使用_變量。

但是,如果您使用_作爲變量名,並且您在該函數中使用它,則會遇到問題。例如:

(_ => console.log(_))(); 

不是一回事

(() => console.log(_))(); 

在第一行中,函數打印參數_,其中,在這種情況下是undefined的值,因爲沒有值被傳遞到它。在第二行中,函數打印全局變量_的值。如果您使用像underscore.js這樣的庫,其中使用變量_,這可能會成爲問題。

+1

儘管兩者在內部產生相同的輸出,但它們是不同的,對嗎? – James

1

A「脂肪箭頭」(=>)函數可以用單個標識符參數名被聲明,或與零個或更多個參數的括號的列表。您的第一個示例

(_ => console.log(1))(); 

是第一種情況,參數名稱爲「_」。第二個例子是一個參數列表不帶參數:

(() => console.log(1))(); 

既不功能使用其參數的,並且兩個調用傳遞任何參數。也就是說,這兩個函數調用都沒有實際的參數;報表均以()結尾。這兩者是否「等同」取決於你對「等效」的定義。在這兩種情況下,都會發生完全相同的事情。但是,匿名胖箭頭功能並不完全相同。

+1

在Erlang編程語言中,顯式被視爲「忽略」的參數以下劃線開頭。有趣的事實。 – Pointy

+0

很高興知道,感謝您的提示! – James

0

不,它們不相同。第一個是具有1個參數的匿名胖箭頭函數,第二個是具有0個參數的匿名胖箭頭函數。因此,第一個依賴於將一個函數的參數傳遞太少並不是ECMAScript中的錯誤。

下劃線_有時用於指示滿足某個合同所需的參數,但實際上被忽略。但是,在這種情況下,由於參數不是必需,因此這是該慣例的濫用:該函數不帶參數被調用,因此不需要聲明參數。