Jackson respondeu parcialmente a isso em uma pergunta semelhante:
Retorno implícito, mas apenas se não houver bloqueio.
- Isso resultará em erros quando um one-liner se expandir para várias linhas e o programador esquecer de adicionar um
return
.
- O retorno implícito é sintaticamente ambíguo.
(name) => {id: name}
retorna o objeto {id: name}
... certo? Errado. Retorna undefined
. Essas chaves são um bloco explícito. id:
é um rótulo.
Eu acrescentaria a isso a definição de um bloco :
Uma instrução de bloco (ou instrução composta em outros idiomas) é usada para agrupar zero ou mais instruções. O bloco é delimitado por um par de colchetes.
Exemplos :
// 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
com a função entre parênteses e invocada com um argumento, "Jess". O código entre=>
e)('Jess')
em cada caso é o corpo da função de seta. Considere-o como uma forma abreviada de uma Expressão de Função Imediatamente Invocada do formulário(function (name) { return { id: name } })('Jess')
{}
) ou um bloco , ele assume que a{ }
denota um bloco. Isso significa que, quando vêid: name
, acha queid:
é uma expressão que cria um rótulo (um recurso muito incomum do JS que lida com controle de fluxo e usa a:
) e, aname
seguir,id:
é simplesmente uma declaração separada que contém apenas a variávelname
(& faz nada).Eu entendo essa regra de ouro ...
Os candidatos são:
Para outras operações (mais de uma linha que requerem um bloco, o retorno deve ser explícito
fonte
Há outro caso aqui.
Ao gravar um componente funcional no React, é possível usar parênteses para agrupar JSX retornado implicitamente.
fonte
As funções de seta permitem um retorno implícito: os valores são retornados sem a necessidade de usar a
return
palavra - chave.Funciona quando há uma instrução on-line no corpo da função:
Outro exemplo, retornando um objeto (lembre-se de colocar os colchetes entre parênteses para evitar que sejam considerados os colchetes da função de empacotamento):
fonte
Aqui está outro caso que me deu alguns problemas.
Aqui, definimos uma função que retorna uma função anônima. O bit "complicado" é que o corpo da função externa (a parte que começa com (bar) => ...) visualmente se parece com um "bloco", mas não é. Como não é, o retorno implícito entra em ação.
Aqui está como o wrap seria executado:
A maneira como eu descompactei isso para garantir que eu entendesse era "desfazer a estreitamento" das funções.
Aqui está o equivalente semântico do primeiro bloco de código, simplesmente fazendo o corpo de wrap () fazer um retorno explícito. Esta definição produz os mesmos resultados que acima. É aqui que os pontos se conectam. Compare o primeiro bloco de código acima com o bloco abaixo e fica claro que uma função de seta é tratada como uma expressão, não como um bloco, e tem o retorno implícito .
A versão totalmente não-restrita do wrap seria assim, que apesar de não ser tão compacta quanto a versão com flecha, parece muito mais fácil de entender.
No final, para outros que talvez precisem ler meu código e me futuro, acho que prefiro usar a versão sem flechas que pode ser compreendida visualmente à primeira vista, em vez da flecha que exige bastante pensei (e no meu caso experimentação) a grok.
fonte