箭头函数后面带有()代表什么意思?

5
const actionsMap = {
  [GET_USER]: (state, action) => ({ post: action.msg })
};

我发现了这段代码。在我一直使用箭头函数时,我见过{}的格式,但是这个()包装器是什么意思呢?


你确定这是Javascript吗?我的控制台无法解析它。我认为它可能是Coffeescript或其他类似的衍生语言。 - Erik
那看起来像是一个Lambda表达式,它在JS中不被支持。 - Mr. Polywhirl
MDN:箭头函数这是 ECMAScript 2015(ES6)标准的新技术。该技术的规范已经最终确定,但请查看兼容性表格以了解各种浏览器中的使用和实现状态。 箭头函数表达式(也称为fat arrow function)与函数表达式相比具有更短的语法,并在词法上绑定this值。箭头函数始终是匿名的。 - Mr. Polywhirl
1
所以你已经知道了“箭头函数”的术语和概念……不确定还有什么需要告诉你的。 - user1106925
3个回答

7

使用箭头函数时,可以选择使用单个语句或代码块作为函数体,这两者是等效的:

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

在您的例子中,如果Lambda被定义为() => {post: action.msg},那么对象({})将被解释为一个主体块而不是一个对象。运行时会试图将其解析为相当于以下内容:
function () {
  post: action.msg
}

这是一个命名的标签和属性访问,对于此处并不合理。通过使用括号将其包裹,您向解析器提示它是一个需要评估的表达式,并且在单表达式体上使用fat箭头函数规则,使其等效于:

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

为了绕过单表达式规则,当您想要执行两个相关操作时(在map/reduce算法中偶尔很有用),您可以使用括号来将一对表达式分组:
foo.reduce((p, c) => (c.counted = true, p += c.value));

这将设置 c 的 counted 属性,然后将 c.value 添加到 p 中,并返回 p + = c.value 的结果作为 p 的新值。 括号在ECMAScript中包装表达式,并可与逗号运算符一起用于分组多个表达式。当计算分组时,返回最后一个表达式的结果。
例如:
var i = 0, j = 0;
console.log((j += 10, i += 2), j);

将打印2 10,因为j()组中被增加,并稍后打印。


1
“...这显然是无效的。”在那种特定情况下并不是真正的无效,但肯定不是预期的结果。 - user1106925
2
@squint 已修复。我总是忘记标签。 - ssube
谢谢,这个回答比其他回答更详细,所以我将其选为正确答案,因为它明确表示它是一个对象响应。其他答案更简洁,适合其他人,所以请继续查看。 - Vinicius Ataide

2

2
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions#Returning_object_literals
返回对象字面量 请记住,使用简洁语法params => {object:literal}返回对象字面量将无法按预期工作:
var func =()=> {foo:1}; //调用func()返回undefined! var func =()=> {foo:function(){} }; // SyntaxError:函数语句需要名称
这是因为大括号({})内的代码被解析为语句序列(即foo被视为标签,而不是对象文字中的键)。
记得用括号包装对象字面量:
var func =()=>({foo:1});
所以..如果你想返回一个对象字面量,请用括号包装它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接