我什么时候应该在es6箭头函数中使用`return`?

Jes*_*ord 138 javascript return function ecmascript-6 arrow-functions

新的es6箭头函数return在某些情况下是隐含的:

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

在什么情况下我需要使用returnes6箭头功能?

Jes*_*ord 239

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

隐含的回报,但只有在没有阻止的情况下.

  • 当单行扩展到多行并且程序员忘记添加a时,这将导致错误return.
  • 隐含的回归在语法上是模棱两可的.(name) => {id: name}返回对象{id: name}......对吗?错误.它回来了undefined.那些括号是一个明确的块.id:是一个标签.

我想补充一个的定义:

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

示例:

// 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') 
Run Code Online (Sandbox Code Playgroud)

  • 这么多的混淆空间 (23认同)
  • @vdclouis是的,这是倒数第二个例子:`((name)=>({id:name}))('Jess')//返回{id:'Jess'}` (4认同)
  • 要清楚,似乎因为JS解析器不知道是否期望*表达式*(例如包含对象文字`{}`的表达式)或*块*,它假设一个`{}`表示一个块.这意味着当它看到`id:name`时,它认为`id:`是一个创建[label]的表达式(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label)(JS的一个非常罕见的用于处理流控制并使用`:`)的特性,然后在`id:`之后的`name`只是一个单独的语句,它只包含变量`name`( & 什么也没做). (4认同)
  • 如果需要,可以隐式返回对象.像这样:`((name)=>({id:name}))('Louis')` (3认同)
  • @MichaelDausmann这是一个箭头函数,它有一个参数`name`,函数括在括号中,并用一个参数"Jess"调用.在每种情况下,`=>`和`('Jess')之间的代码是箭头函数的主体.将其视为形式为`(function(name){return {id:name}})('Jess')的立即调用函数表达式的简短形式. (3认同)

Ama*_*rsh 15

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

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

候选人是:

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

// sum
(a,b) => a+b
Run Code Online (Sandbox Code Playgroud)

对于其他操作(需要块的多于一行),返回必须是显式的


小智 8

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

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

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

以下是 wrap 的执行方式:

// 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'));
Run Code Online (Sandbox Code Playgroud)

我打开它以确保我理解它的方式是“解开”功能。

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

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

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

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

最后,对于其他可能需要阅读我的代码的人,以及未来的我,我想我更愿意使用第一眼可以在视觉上理解的非箭头版本,而不是需要相当多的箭头版本想(在我的情况下是实验)去理解。


小智 7

这里还有另一种情况。

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

const FunctionalComponent = () => (
  <div>
    <OtherComponent />
  </div>
);
Run Code Online (Sandbox Code Playgroud)

  • 您始终可以使用括号,它与 JSX 或 React **无关**。 (14认同)

Fla*_*pes 6

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

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

const myFunction = () => 'test'

console.log(myFunction()) //'test'
Run Code Online (Sandbox Code Playgroud)

另一个例子,返回一个对象(记住将大括号包裹在括号中,以避免它被认为是包裹函数体括号):

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

console.log(myFunction()) //{value: 'test'}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是正确的答案,尽管需要更多解释。基本上,当函数体是一个表达式而不是一个块时,该表达式的值是隐式返回的。如果我错了纠正我。 (3认同)