箭头在()之后用什么方式起作用?

时间:2015-07-10 16:04:57

标签: javascript ecmascript-6

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

我有这个代码,我偶然发现了。我一直在使用{}格式的箭头函数,这个()包装是什么意思?

3 个答案:

答案 0 :(得分:7)

使用箭头功能,您可以使用单个语句或块作为函数体。这两个是等价的:

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

在您的示例中,如果lambda定义为() => {post: action.msg},则对象({})将被解释为正文块而不是对象。运行时会尝试将其解析为:

function () {
  post: action.msg
}

这是一个命名的标签和属性访问,在这里没有多大意义。通过包装在parens中,您提示解析器它是一个要计算的表达式,单个表达式主体上的胖箭头函数规则启动,使其等效于:

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

要想要执行两个相关的事情(偶尔在map / reduce算法中有用)时要解决单表达式规则,可以使用parens对一对表达式进行分组:

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

在将counted添加到c并将c.value的结果作为p的新值返回之前,这将设置p += c.value的{​​{1}}属性1}}。

括号在ECMAScript中包装表达式,可以使用逗号运算符对多个表达式进行分组。在评估组时,将返回最后一个表达式的结果。

例如:

p

将打印var i = 0, j = 0; console.log((j += 10, i += 2), j); ,因为2 10组中的j会增加并稍后打印。

答案 1 :(得分:2)

这是ES6箭头功能。更多内容如下: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions

ES6

(state, action) => ({ post: action.msg })

ES5

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

答案 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()返回   未定义! var func =()=> {foo:function(){}}; //   SyntaxError:函数语句需要名称

     

这是因为大括号({})内的代码被解析为序列   语句(即foo被视为标签,而不是对象中的键   文字)。

     

请记住将对象文字包装在括号中:

     

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

所以..如果你想返回一个对象文字,请将其包装在()