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)
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)
箭头函数允许您隐式返回:无需使用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)