什么时候应该在 ES6 箭头函数中使用 return 语句

When should I use a return statement in ES6 arrow functions

提问人:Jess Telford 提问时间:3/6/2015 最后编辑:double-beepJess Telford 更新时间:7/10/2022 访问量:111496

问:

新的 ES6 箭头函数表示在某些情况下是隐式的:return

表达式也是该函数的隐式返回值。

在什么情况下需要使用 ES6 箭头函数?return

javascript ecmascript-6 箭头函数

评论


答:

318赞 Jess Telford 3/6/2015 #1

杰克逊在类似的问题中部分回答了这一点

隐式返回,但前提是没有块。

  • 当单行代码扩展到多行并且程序员忘记添加 .return
  • 隐式返回在语法上是模棱两可的。返回对象...右?错。它返回 .这些大括号是一个显式块。 是一个标签。(name) => {id: name}{id: name}undefinedid:

我想补充一下的定义:

块语句(或其他语言中的复合语句)用于对零个或多个语句进行分组。该块由一对大括号分隔。

示例

// returns: undefined
// explanation: an empty block with an implicit return
((name) => {})() 

// returns: 'Hi Jess'
// explanation: no block means implicit return
((name) => 'Hi ' + name)('Jess')

// returns: undefined
// explanation: explicit return required inside block, but is missing.
((name) => {'Hi ' + name})('Jess')

// returns: 'Hi Jess'
// explanation: explicit return in block exists
((name) => {return 'Hi ' + name})('Jess') 

// returns: undefined
// explanation: a block containing a single label. No explicit return.
// more: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label
((name) => {id: name})('Jess') 

// returns: {id: 'Jess'}
// explanation: implicit return of expression ( ) which evaluates to an object
((name) => ({id: name}))('Jess') 

// returns: {id: 'Jess'}
// explanation: explicit return inside block returns object
((name) => {return {id: name}})('Jess') 

评论

0赞 Michael Dausmann 7/14/2015
我不明白那个语法..您是否使用类沿海创建一个类,然后使用一个参数(“Jess”)调用隐含构造函数??我以为你会这样做 ((name) => ({id: 'Jess'}))
4赞 Russ Cam 7/14/2015
@MichaelDausmann 它是一个箭头函数,它有一个参数 ,该函数括在括号中,并使用一个参数“Jess”调用。在每种情况下,和之间的代码是箭头函数的主体。将其视为该表单的 Immediately Invoked Function Expression 的缩写形式name=>)('Jess')(function (name) { return { id: name } })('Jess')
0赞 jay shah 10/6/2016
非常有用的indded!帮助发现 Promises.all 中使用箭头函数映射项目的问题,如果使用箭头函数映射数组时没有返回任何值,则可以注意到是否得到一个 undefined 数组。
0赞 Augustin Riedinger 2/17/2017
为箭头函数提供系统化的隐式返回有什么缺点?就像 coffeescript 一样......(虽然我不喜欢coffeescript)
9赞 iono 8/1/2018
需要明确的是,似乎因为 JS 解析器不知道是期望一个表达式(例如一个包含对象文字的表达式)还是一个块,所以它假设 a 表示一个。这意味着当它看到 时,它认为是一个创建标签的表达式(JS 中一个非常不常用的功能,它处理流控制并使用 ),然后下面只是一个单独的语句,它只包含变量(& 什么都不做)。{}{ }id: nameid::nameid:name
26赞 Amarsh 1/12/2017 #2

我理解这个经验法则......

对于有效转换的函数(参数的单行操作),return 是隐式的。

候选人是:

// square-root 
value => Math.sqrt(value)

// sum
(a,b) => a+b

对于其他操作(需要块的多行代码),return 必须是显式的

8赞 Flavio Copes 4/22/2018 #3

箭头函数允许您获得隐式返回:无需使用关键字即可返回值。return

当函数体中有一个在线语句时,它起作用:

const myFunction = () => 'test'

console.log(myFunction()) //'test'

另一个例子,返回一个对象(记得将大括号括起来,以避免将其视为包装函数体括号):

const myFunction = () => ({value: 'test'})

console.log(myFunction()) //{value: 'test'}

评论

5赞 Paul-Sebastian Manole 4/28/2019
这应该是正确的答案,尽管需要更多的解释。基本上,当函数体是表达式而不是块时,该表达式的值是隐式返回的。如果我错了,请纠正我。
12赞 Deci 7/6/2018 #4

这里还有另一个案例。

例如,在 React 中编写功能组件时,可以使用括号来包装隐式返回的 JSX。

const FunctionalComponent = () => (
  <div>
    <OtherComponent />
  </div>
);

评论

19赞 Emile Bergeron 7/3/2019
你总是可以使用括号,它与 JSX 或 React 无关
11赞 grayjohn 1/30/2019 #5

这是另一个给我带来麻烦的案例。

// the "tricky" way
const wrap = (foo) => (bar) => {
  if (foo === 'foo') return foo + ' ' + bar;
  return 'nofoo ' + bar;
}

在这里,我们定义一个返回匿名函数的函数。“棘手”的一点是,外部函数的函数体(以 (bar) => ...开头的部分)在视觉上看起来像一个“块”,但事实并非如此。既然不是,隐式回报就会启动。

以下是包装的执行方式:

// use wrap() to create a function withfoo()
const withfoo = wrap('foo');
// returns: foo bar
console.log(withfoo('bar'));

// use wrap() to create a function withoutfoo()
const withoutfoo = wrap('bar');
// returns: nofoo bar
console.log(withoutfoo('bar'));

我解开它以确保我理解它的方式是“取消箭头化”功能。

这是第一个代码块的语义等价物,只需使 wrap() 的主体进行显式返回即可。此定义产生的结果与上述相同。这是点连接的地方。将上面的第一个代码块与下面的代码块进行比较,很明显,箭头函数本身被视为表达式,而不是块,并且具有隐含的返回值。

// the explicit return way
const wrap = (foo) => {
  return (bar) => {
    if (foo === 'foo') return foo + ' ' + bar;
    return 'nofoo ' + bar;
  }
}

完全无箭头的包裹版本是这样的,虽然不像胖箭头版本那样紧凑,但似乎更容易理解。

// the "no arrow functions" way
const wrap = function(foo) {
  return function(bar) {
    if (foo === 'foo') return foo + ' ' + bar;
    return 'nofoo ' + bar;
  };
};

最后,对于其他可能必须阅读我的代码和未来的我的人来说,我想我更愿意选择乍一看可以直观理解的非箭头版本,而不是需要相当多的思考(在我的情况下是实验)才能摸索的箭头版本。

评论

0赞 Mujibur 11/22/2021
很好的解释。你能表达一下它调用的方法/过程是什么吗?
0赞 Mujibur 11/22/2021
基本上,喜欢这样对吗?const wrap = function(foo) { return function(bar) { if (foo === 'foo') return foo + ' ' + bar; return 'nofoo ' + bar;运行包装函数: wrap('foo')('bar');
1赞 rob_abcba 2/26/2021 #6

在以下情况下,可以从箭头函数中省略括号 {} 和 return 关键字: (1) 在返回语句之前,您不会有任何代码(例如分配语句),并且 (2) 您将返回单个实体 [注意:单个实体可以是多行。如果是这样,那么您只需要常规括号(),如下例所示:

posts.map(post => (
  <li key={post.id}>
    {post.title}
  </li>
))