Новые функции стрелки es6 говорят, return
что неявные при некоторых обстоятельствах:
Выражение также является неявным возвращаемым значением этой функции.
В каких случаях мне нужно использовать return
функции стрелок es6?
Новые функции стрелки es6 говорят, return
что неявные при некоторых обстоятельствах:
Выражение также является неявным возвращаемым значением этой функции.
В каких случаях мне нужно использовать return
функции стрелок es6?
Ответы:
Джексон частично ответил на аналогичный вопрос:
Неявный возврат, но только если блока нет.
- Это приведет к ошибкам, когда однострочник расширяется до нескольких строк, и программист забывает добавить 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')
name
с функцией, заключенной в круглые скобки и вызываемой с одним аргументом «Jess». Код между =>
и )('Jess')
в каждом случае является телом функции стрелки. Рассматривайте это как краткую форму выражения «Немедленно вызванная функция»(function (name) { return { id: name } })('Jess')
{}
) или блок , он предполагает, что a { }
обозначает блок. Это означает, что когда он видит id: name
, он думает, что id:
является выражением, создающим метку (очень редко используемая особенность JS, которая имеет дело с управлением потоком и использует a :
), а затем name
следующее id:
является просто отдельным оператором, который содержит только переменную name
(& ничего не делает).
Я понимаю это правило ...
Для функций, которые эффективно трансформируются (однострочные манипуляции с аргументами), return является неявным.
Кандидатами являются:
// square-root
value => Math.sqrt(value)
// sum
(a,b) => a+b
Для других операций (более чем в одной строке, требующих блока, return должен быть явным
Здесь есть еще один случай.
При написании функционального компонента в React вы можете использовать скобки для неявного переноса возвращаемого JSX.
const FunctionalComponent = () => (
<div>
<OtherComponent />
</div>
);
Вот еще один случай, который доставил мне некоторые проблемы.
// 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;
};
};
В конце концов, для других, которым, возможно, придется читать мой код, и для будущего, я думаю, я бы предпочел использовать версию без стрелки, которая может быть понятна на первый взгляд, а не версию со стрелкой, которая занимает немало времени. думал (и в моем случае эксперименты), чтобы впасть.
Функции стрелок позволяют получить неявный возврат: значения возвращаются без использования return
ключевого слова.
Работает, когда в теле функции есть оператор on-line:
const myFunction = () => 'test'
console.log(myFunction()) //'test'
Другой пример, возвращающий объект (не забудьте заключить фигурные скобки в круглые скобки, чтобы он не рассматривался в скобках тела функции обтекания):
const myFunction = () => ({value: 'test'})
console.log(myFunction()) //{value: 'test'}