2016-09-30 32 views
7

使用巴貝爾,我可以看到如何在||上使用箭頭功能運營商

callback =() => {}; 

編譯成

callback = function callback() {}; 

這是我的期望。不過,我得到一個錯誤,當我嘗試用||

callback = callback ||() => {} 

使用這些功能,我期望等同於

callback = callback || function(){}; 

爲什麼這是一個錯誤?另外,這種熟悉的語法是否有更正確的ES6版本?

+2

難道你不能只是把'callback = callback || ()=> {})' – adeneo

+1

以類似的方式,您不能立即調用'()=> {}()';你必須寫'(()=> {})()'。 – 2016-09-30 16:24:21

+1

@ 1252748,這是一個經典的[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。您的中間目標是如果變量未設置,則將函數賦值給變量,因此您可以詢問「||」。但是您仍然沒有問過關於您的主要目標的問題:即,此代碼的寫入內容是什麼?你想解決什麼問題?我懷疑有更好的解決方案。 – naomik

回答

6

它失敗,因爲這只是無效的語法。

使用以下,使其工作:

callback = callback || (() => {}) 

如果不換行這樣的說法,這將是,如果你鍵入以下解釋。但是這是無效的語法。

callback = (callback ||()) => {} 

爲了延長分配的評價,看到AssignmentExpression的規範。它由一個ConditionalExpression或一個ArrowFunction(或其他一些我會忽視的表情)組成。所以解釋器會嘗試使用你的代碼作爲條件。但()本身在該上下文中無效,因爲預計表達式內部ParenthesizedExpression。結果,它會失敗。如果將表達式分組爲callback || (() => {})LogicalOrExpressions的兩側都是有效的表達式。

+1

我明白了。其中,在該表的優先級爲'()=> {}'? – 1252748

+0

@ 1252748你是對的,MDN環節沒有明確指定箭頭的功能。我增加了一些上下文我的回答,我希望幫助。 – str

+1

很好的解釋 - 好像口譯員本身在說話:D – ftor

4

由於運算符優先級,你必須包裝在括號中的箭頭的功能,使其工作:

callback = callback || (() => {}) 
+5

優先級是什麼? – 2016-09-30 16:25:09

2

如果你打算使用||爲回調參數爲提供一個默認值功能,寫起來更容易

function myfunc(callback =() => { }) { 
    callback("Hi 1252748"); 
} 

不需要額外的零部件。

+0

謝謝!我認爲,但說實話,我發現一個函數的默認參數太亂看。事實上,我甚至都不喜歡這一切。這在參數列表中太多了。 – 1252748

+0

當然,它處理的是一個帶有默認值的布爾參數的問題,這個問題不容易被'||'成語處理。就我個人而言,我**愛**默認參數並始終使用它們。 – 2016-09-30 16:34:13

+0

'「一個帶默認值的布爾參數,」||「成語不容易處理」你能解釋一下你的意思嗎? '||'如何不容易處理布爾值? – 1252748