2015-07-10 15 views
4
const actionsMap = { 
    [GET_USER]: (state, action) => ({ post: action.msg }) 
}; 

我有這段代碼,我已經偶然發現。我一直在用{}格式看過的箭頭函數,這個()包裝器是什麼意思?箭頭與()後面的含義是什麼?

+0

你確定這是JavaScript?它不會在我的控制檯中解析。我認爲這是Coffeescript或其他這樣的衍生語言。 – Erik

+0

這看起來像一個lambda表達式,它不受JS的支持。 –

+4

@Erik - 這是ES6 –

回答

7

隨着箭頭的功能,你可以使用一個單獨的語句或函數體塊。這兩個是相同的:

() => foo 
() => { 
    return foo; 
} 

在您的例子中,如果拉姆達定義爲() => {post: action.msg}對象({})將被解釋爲一個塊體,而不是一個對象。運行時會嘗試解析它作爲一個等同於:

function() { 
    post: action.msg 
} 

這是一個名爲標籤和屬性訪問,並且不會在這裏太大的意義。通過在括號包裹,你暗示,這是要計算表達式,在單表達體脂肪箭頭功能規則踢解析器,使其等同於:

function() { 
    return {post: action.msg}; 
} 

要解決的單

foo.reduce((p, c) => (c.counted = true, p += c.value)); 

這將設置的ccounted屬性,添加c.value前:當你想要做的兩個相關的東西(在地圖偶爾有用/減少算法),你可以用括號來組表達對錶達式規則到p並返回的結果作爲p的新值的。

括號將ECMAScript中的表達式包裝起來,並且可以使用逗號運算符對多個表達式進行分組。評估組時,返回最後一個表達式的結果。

例如:

var i = 0, j = 0; 
console.log((j += 10, i += 2), j); 

將打印2 10,由於j()組中遞增,並且以後打印​​。

+1

「......這顯然是無效的。」在這個特殊情況下實際上不是無效的,但當然不是預期的。 – 2015-07-10 16:24:10

+2

@squint固定。我總是忘記標籤。 – ssube

+0

謝謝,這個迴應比其他人更詳細,所以我把這個投票作爲正確投票,因爲它顯然意味着它是一個對象迴應。其他答案對其他人更簡潔,更好,因此請繼續檢查 –

2

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions#Returning_object_literals

Returning object literals

Keep in mind that returning object literals using the concise syntax params => {object:literal} will not work as expected:

var func =() => { foo: 1 }; // Calling func() returns undefined! var func =() => { foo: function() {} }; // SyntaxError: function statement requires a name

This is because the code inside braces ({}) is parsed as a sequence of statements (i.e. foo is treated like a label, not a key in an object literal).

Remember to wrap the object literal in parentheses:

var func =() => ({ foo: 1 });

所以..如果你想返回一個對象文本,把它包在()