Джексон частично ответил на аналогичный вопрос:
Неявный возврат, но только если блока нет.
- Это приведет к ошибкам, когда однострочник расширяется до нескольких строк, и программист забывает добавить 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 должен быть явным
источник
Здесь есть еще один случай.
При написании функционального компонента в React вы можете использовать скобки для неявного переноса возвращаемого JSX.
источник
Вот еще один случай, который доставил мне некоторые проблемы.
Здесь мы определяем функцию, возвращающую анонимную функцию. «Хитрый» бит в том, что тело функции для внешней функции (часть, начинающаяся с (bar) => ...) визуально выглядит как «блок», но это не так. Так как это не так, неявное возвращение вступает в силу.
Вот как будет выполняться перенос:
Способ, которым я распаковал это, чтобы удостовериться, что я понял, состоял в том, чтобы "разархивировать" функции.
Вот семантический эквивалент первого блока кода, просто заставляющий тело wrap () делать явный возврат. Это определение дает те же результаты, что и выше. Это где точки соединяются. Сравните первый блок кода выше с приведенным ниже, и станет ясно, что сама функция стрелки обрабатывается как выражение, а не как блок, и имеет подразумеваемый возврат .
Полная версия обертки была бы такой, которая не так компактна, как версия с жирными стрелками, но кажется, что ее легче понять.
В конце концов, для других, которым, возможно, придется читать мой код, и для будущего, я думаю, я бы предпочел использовать версию без стрелки, которая может быть понятна на первый взгляд, а не версию со стрелкой, которая занимает немало времени. думал (и в моем случае эксперименты), чтобы впасть.
источник
Функции стрелок позволяют получить неявный возврат: значения возвращаются без использования
return
ключевого слова.Работает, когда в теле функции есть оператор on-line:
Другой пример, возвращающий объект (не забудьте заключить фигурные скобки в круглые скобки, чтобы он не рассматривался в скобках тела функции обтекания):
источник