为什么要将箭头函数体括在括号内? [重复]

问题描述 投票:0回答:3
const actionsMap = {
  [GET_USER]: (state, action) => ({ post: action.msg })
};

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

javascript ecmascript-6 arrow-functions
3个回答
7
投票

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

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

在您的示例中,如果 lambda 被定义为

() => {post: action.msg}
,则对象 (
{}
) 将被解释为主体块而不是对象。运行时会尝试将其解析为等价物:

function () {
  post: action.msg
}

这是一个命名标签和属性访问,在这里没有多大意义。通过用括号括起来,您向解析器暗示它是一个要计算的表达式,并且单表达式主体上的粗箭头函数规则启动,使其相当于:

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

当您想要做两个相关的事情时(在映射/归约算法中偶尔有用),要解决单表达式规则,您可以使用括号将一对表达式分组:

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

这将设置

counted
c
属性,然后将
c.value
添加到
p
并返回
p += c.value
的结果作为
p
的新值。

ECMAScript 中的括号将表达式括起来,并且可以与逗号运算符一起使用来对多个表达式进行分组。当对组求值时,返回最后一个表达式的结果。

例如:

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

将打印

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


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() {} }; // 语法错误:函数语句需要名称

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

记得将对象字面量括在括号中:

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

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


1
投票

这是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 };
}
© www.soinside.com 2019 - 2024. All rights reserved.