【问题标题】:What does the arrow function with a () after means? [duplicate]后面带 () 的箭头函数是什么意思? [复制]
【发布时间】:2015-09-29 11:28:46
【问题描述】:
const actionsMap = {
  [GET_USER]: (state, action) => ({ post: action.msg })
};

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

【问题讨论】:

  • 你确定这是 Javascript 吗?它不会在我的控制台中解析。我认为是 Coffeescript 或其他类似的衍生语言。
  • 看起来像个lambda表达式,JS不支持。
  • MDN: Arrow Functions: 这是一种新技术,是 ECMAScript 2015 (ES6) 标准的一部分。该技术的规范已经定稿,但请查看兼容性表,了解各种浏览器的使用情况和实现情况。 箭头函数表达式(也称为胖箭头函数 ) 与函数表达式相比具有更短的语法并在词法上绑定 this 值。箭头函数始终是匿名的。
  • 所以你已经知道“箭头函数”的术语和概念...不知道还有什么要告诉你的。

标签: javascript ecmascript-6


【解决方案1】:

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

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

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

function () {
  post: action.msg
}

这是一个命名标签和属性访问,在这里没有多大意义。通过包裹在括号中,您可以向解析器提示它是一个要计算的表达式,并且单表达式主体上的胖箭头函数规则开始生效,使其等效于:

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

当您想要做两个相关的事情(有时在 map/reduce 算法中有用)时,要绕过单一表达式规则,您可以使用括号对一对表达式进行分组:

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

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

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

例如:

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

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

【讨论】:

  • “……这显然是无效的。”在那种特殊情况下实际上并不是无效的,但肯定不是预期的。
  • @squint 已修复。我总是忘记标签。
  • 谢谢,这个响应比其他响应更详细,所以我将其投票为正确的,因为它显然意味着它是一个对象响应。其他答案更简洁,对其他人来说更好,所以请继续检查
【解决方案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 };
}

【讨论】:

    【解决方案3】:

    来自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 });

    so .. 如果你想返回一个对象字面量,把它包装在 ()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      相关资源
      最近更新 更多