Qual é a diferença entre return e return ()?

97
function a() { return 1; }
function b() { return(1); }

Testei o código acima no console do Chrome e ambos retornaram 1.

function c() { return "1"; }
function d() { return("1"); }

Eu também testei o código acima e ambas as funções retornaram "1".

Então, qual é a diferença entre usar returne return()?

chris97ong
fonte
21
As respostas aqui também se aplicam a void(x),typeof(x)
Paul S.
3
@ PaulS. — sempre ficou intrigado, void(0)já que deveria ser uma abreviação para indefinido . Então, se for taquigrafia, por que incluir caracteres desnecessários? ;-)
RobG de
1
@RobG Acho que é uma herança do Python e pode realmente ser útil para casos especiais em que você deseja incluir operadores void i = 1; // ReferenceErrorvsvoid (i = 1); // undefined
Paul S.
1
Você pode se divertir com esta pergunta, que é a sua pergunta aplicada a C #: stackoverflow.com/questions/2186595/…
Eric Lippert,
3
possível duplicata de Por que usar parênteses ao retornar em Javascript
Qantas 94 Heavy

Respostas:

177

O mesmo que entre

var i = 1 + 1;

e

var i = (1 + 1);

Isso não é nada. Os parênteses são permitidos porque são permitidos em qualquer expressão para influenciar a ordem de avaliação, mas em seus exemplos eles são simplesmente supérfluos.

returnnão é uma função, mas uma declaração . É sintaticamente semelhante a outras instruções de fluxo de controle simples como breake continueque também não usam parênteses.

RemcoGerlich
fonte
12
Uma declaração de retorno pode ser seguida por uma expressão. Um retorno deve estar em uma função, então a função retorna o valor da expressão, ou se não houver, indefinido .
RobG de
37
@ chris97ong: o retorno não é uma função.
RemcoGerlich de
34
Se você transformou returnem uma função, como você retornaria um valor dela?
dan04 de
4
Essa é uma ótima resposta com um ótimo exemplo, mas acho que pode valer a pena acrescentar que 'retornar' não é uma função da resposta principal - considerando que é a raiz do mal-entendido que levou a esta pergunta.
BiscuitBaker
3
@BiscuitBaker: Eu adicionei um pouco. Quando anotei esta resposta curta, não esperava obter mais de 50
votos positivos
21

Não há diferença.

returnnão é uma chamada de função, mas é uma declaração de linguagem. Tudo o que você está fazendo com os parênteses é simplesmente agrupar seu valor de retorno para que possa ser avaliado. Por exemplo, você pode escrever:

return (x == 0);

Nesse caso, você retorna o valor da instrução x == 0, que retornará um booleano trueou falsedependendo do valor de x.

Alpartis
fonte
6
return é uma palavra-chave que significa o início de uma instrução return .
RobG de
1
A avaliação da declaração de retorno não precisa de "agrupamento". Portanto, em qualquer caso, haverá um retorno booleano.
Wolf
18

Na verdade, aqui a precedência de ()é mais alta, por isso avalia primeiro:

Aqui primeiro ("1")seja avaliado, da seguinte forma:

("1")                     ==> "1"
("1","2")                 ==> "2"
("1","2","3")             ==> "3"
("1"+"2","2"+"2","3"+"2") ==> "32"
(2+3+6)                   ==>  11

então a declaração acima é equivalente a:

return "1";

Veja visualmente:

viusal

Portanto, basicamente não há diferença na funcionalidade, mas o segundo pode ser um pouco lento, pois primeiro resolve os colchetes.

Zaheer Ahmed
fonte
2
Por que você faria uma afirmação completamente não verificada de que "o segundo pode ser um pouco mais lento" quando esse não é o caso?
9

Não há absolutamente nenhuma diferença. Se você olhar para a especificação JS (ECMAScript) da instrução de retorno . Entre muitas outras coisas, ele está lhe dizendo:

return [sem LineTerminator aqui] Expression;

que você pode fornecer expressão return. Expressão é hello, Math.abs(x), yourCustomFunc(7), ou em seu segundo caso isso pode ser 1ou (1). Expressão 1após avaliação é igual (1)e igual (((((1))))))ou até mesmo como algo realmente bizarro (+(!(+(!1)))).

Salvador Dalí
fonte
1
+1 para a referência oficial. Não existe uma referência página a página? - O HTML de uma página carrega muito tempo.
Wolf
@Wolf eu não encontrei tal. Aqui está outro, mas também é uma página people.mozilla.org/~jorendorff/…
Salvador Dali
Sim, triste. Eu também não tive sucesso. Que tal expandir sua citação para toda a sintaxe da instrução return?
Wolf
9

Não há diferença, os parênteses são opcionais. Veja MSDN :

return[(][expression][)];

O argumento opcional da expressão é o valor a ser retornado da função. Se omitido, a função não retorna um valor.

Você usa a instrução return para interromper a execução de uma função e retornar o valor da expressão. Se a expressão for omitida ou nenhuma instrução de retorno for executada de dentro da função, a expressão que chamou a função atual receberá o valor undefined.

Evan Knowles
fonte
8
Apenas a MS pensaria em tornar o agrupamento "opcional" em uma instrução de retorno . Eles são tão "opcionais" lá como em qualquer expressão ou em muitas outras partes da gramática.
RobG de
@RobG: Mas, aparentemente, eles são muito mais propensos a serem questionados em um returncomunicado. : P MS provavelmente se cansou de responder à pergunta de noobs JS.
cHao de
2
A explicação M $ está incorreta. O (), não faz parte da instrução de retorno.
Salman A
4
"Há uma diferença para o leitor." Bem, sim: as especificações do MSDN erroneamente implicam nisso return (expressione return expression)são legais.
Jim Balter
2
@JimBalter Junto com return (), return (e return ): P
Paul
9

returné uma declaração uma palavra-chave que inicia a declaração de retorno , não uma função.

Como foi mencionado, os parênteses extras afetam a ordem de avaliação, mas não são usados ​​para "executar" a função nomeada return. É por isso que essas linhas funcionam sem problemas:

return (1);
var a = (1);

Eles são, na verdade, idênticos a estas linhas:

return 1;
var a = 1;

O motivo que return()gera um erro de sintaxe é o mesmo motivo pelo qual a linha a seguir gera um erro (instrução return incluída para comparação):

return();    // SyntaxError: syntax error
var a = ();  // SyntaxError: syntax error
IQAndreas
fonte
E apenas como uma nota lateral, se returnnão incluir nada depois disso, presume que você deseja retornar undefined.
IQAndreas
@Wolf As expressões são opcionais, então returnpor si só são uma declaração de retorno.
Paul,
6

Há uma enorme diferença para os humanos e nenhuma diferença para o mecanismo Javascript.

return 1é uma declaração que declara que precisamos sair imediatamente da função, resultando no valor 1.

return(1)é a mesma instrução disfarçada como a chamada de função pela convenção idiota de que você não é obrigado a inserir espaço fora dos parênteses em Javascript. Se você usasse um código como este no sistema de produção, qualquer mantenedor virá ao seu escritório com estacas e tochas, depois de passar algum tempo tentando decidir se você realmente tem return()função em algum lugar na base de código ou apenas não sabe para que returnserve a palavra-chave.

Como muitas outras pessoas já disseram corretamente, os parênteses não fazem nada, exceto "agrupar" com maior precedência do literal para o número 1.

hijarian
fonte
3
“Há uma grande diferença para os humanos” - Não competentes. "a mesma afirmação disfarçada de chamada de função" - não há returnfunção. "a convenção idiota de que você não é obrigado a inserir espaço fora dos parênteses em Javascript" - quase nenhuma linguagem exige isso; chamar isso de idiota é idiota. "qualquer mantenedor virá ao seu escritório com estacas e tochas" - ninguém competente o faria. return(1)é uma prática ruim, mas as pessoas que ficam chateadas com essas coisas estão desperdiçando recursos e criando um ambiente ruim.
Jim Balter
@JimBalter "Não competentes" - ha! “Quase nenhuma linguagem exige isso” - é por isso que eu disse “convenção”. Se for idiota, é chamado de "idiota". “Não há returnfunção” - o fato do intérprete proibir você de registrar uma função com o nome returnnão ajudará o leitor do código a não questionar primeiro sua sanidade, portanto, esse código é um desperdício. return(1)não é apenas "má prática", é um sinal perigoso de alguém não saber o que está fazendo!
hijarian de
2
Então você não sabe o que "obrigado" significa ou está mudando sua reivindicação ... de qualquer forma, não vou perder mais meu tempo com você.
Jim Balter,
Duvido da verdade de sua última frase; returntem (em todos os idiomas que conheço que têm essa palavra-chave) menos precedência. Portanto, se a expressão opcional estiver presente, ela é sempre avaliada primeiro.
Wolf
4

Na instrução return, os parênteses ao redor da expressão já estão embutidos.

Em JavaScript, como em muitas outras linguagens (como C, C ++, Java, Python), a instrução de retorno tem duas partes: a palavra-chave returne uma expressão (opcional). Portanto, em qualquer caso, tudo o que segue a returnpalavra-chave é primeiro avaliado como uma expressão , depois disso, a instrução return é "executada" passando o controle de volta para o chamador.

Usar ou não parênteses é uma questão de estilo , enquanto a maioria dos guias de estilo os proíbe para casos triviais como o citado em sua pergunta, porque faz com que o retorno pareça falsamente com uma função.

Adendo posterior

Se estiver com parênteses ou sem, nunca se esqueça de colocar a expressão opcional atrás de return, ou seja, na mesma linha. A verdadeira armadilha com returnem mentiras JavaScript em adicionar uma quebra de linha após ele:

function test() {
  return 
  1;
}

... porque a testfunção acima retornará undefined.

Lobo
fonte
1

adicionando parênteses, garantimos que o javascript não insira um ponto e vírgula antes de várias instruções escritas após o retorno, para referência: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar #Automatic_semicolon_insertion

exemplo :

return a + b;

é transformado em

return; a + b;

por ASI.

O console avisará "código inacessível após declaração de retorno". Para evitar esse problema (para prevenir ASI), você pode usar parênteses:

return ( a + b );
código copiado de: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/return

Rahul Singh Bhadhoriya
fonte
Isso é absolutamente correto e, dessa forma, faz sentido para expressões complexas. Mas você deve adicionar na mesma linha ou diretamente atrás de return na primeira frase para tornar ainda mais claro. Acho que o downvote vem de uma interpretação errônea disso.
Wolf