Cada função Javascript deve retornar um valor?

99

Estou usando o Netbeans para adicionar comentários profissionais a cada função que escrevo. Então, começo cada um com /**e pressiono Enterpara permitir que o Netbeans cumpra o esquema de comentários padrão para a função seguinte.

Até agora, usei isso apenas para a linguagem PHP e, neste caso, o Netbeans estava sempre adicionando @returns {type}parte no esquema de comentários apenas, se a função PHP seguinte realmente incluísse a returninstrução. Nos chamados "procedimentos" (funções que não retornam nenhum valor) esta parte estava faltando.

Hoje eu tentei a mesma coisa para a função Javascript e o Netbeans adicionou @returns {undefined}parte ao esquema de comentários, embora a função seguinte não retorne nada.

Isso me confundiu. O Netbeans sugere desta forma, que toda função Javascript deve retornar alguma coisa? O que devo fazer? Ignorar (ou excluir) essa parte do esquema de comentários ou seguir a sugestão (se for uma sugestão) e adicionar return false;no final dessa função, embora seja inútil para mim?

Trejder
fonte
6
Se nenhum valor de retorno for especificado, o JavaScript retornará undefined. Em muitos idiomas, o resultado da última instrução é retornado (mais útil, IMO). Esses são chamados de retornos implícitos .
Zaz de
Isso responde sua pergunta? Devo retornar algo na função javascript?
cObourski

Respostas:

189

A resposta curta é não.

A verdadeira resposta é sim: o mecanismo JS precisa ser notificado de que alguma função encerrou seu negócio, o que é feito pela função que retorna algo. É também por isso que, em vez de "concluída" , diz-se que uma função "retornou" .
Uma função que carece de uma declaração de retorno explícita retornará undefined, como uma função C (++) que não tem valor de retorno (e sua assinatura reflete isso) para retornar void:

void noReturn()//return type void
{
    printf("%d\n", 123);
    return;//return nothing, can be left out, too
}

//in JS:
function noReturn()
{
    console.log('123');//or evil document.write
    return undefined;//<-- write it or not, the result is the same
    return;//<-- same as return undefined
}

Além disso, em JS, como em quase todas as linguagens, você está livre para simplesmente ignorar o valor de retorno de uma função, o que é feito de maneira terrível:

(function()
{
    console.log('this function in an IIFE will return undefined, but we don\'t care');
}());
//this expression evaluates to:
(undefined);//but we don't care

Em algum nível muito baixo, o retorno é traduzido em algum tipo de salto. Se uma função realmente não retornasse nada , não haveria maneira de saber o que e quando chamar a próxima função ou chamar manipuladores de eventos e outros.

Então, para recapitular: Não, uma função JS não precisa retornar nada no que diz respeito ao seu código. Mas no que diz respeito aos motores JS: uma função sempre retorna algo, seja explicitamente por meio de uma returninstrução ou implicitamente. Se uma função retornar implicitamente, seu valor de retorno sempre será indefinido.

Elias Van Ootegem
fonte
5
Não acredito que C ++ (ou C) "retorne um vazio". A tag "void" indica que não retorna nada. É um ponto menor e não tem nada a ver com a pergunta feita.
Jay
2
Ele não realmente voltar void, ele retorna nada, mas sua assinatura reflete isso através do voidtipo de retorno.
Elias Van Ootegem
há algum benefício de desempenho para um retorno explícito versus implícito?
4m1r
@ 4m1r: Não sei, provavelmente depende do motor. Se houver uma diferença de desempenho, é provável que seja insignificante. O retorno implícito vs return;provavelmente só é útil se você precisar retornar mais cedo. a escrita return undefined;pode produzir resultados diferentes se undefinedresolver para um valor diferente. A maioria (se não todos) dos navegadores irá gerar um erro quando você tentar reatribuir undefined, mas em teoria, é possível aqui está um exemplo usando node.js
Elias Van Ootegem
1
@SebastianLasse: Eu estava me referindo a voidoutras linguagens (como C), onde você pode ter funções como void do_someting(int *arg), mas não pode ter uma variável com o tipo void. Em C, voidnão é realmente um tipo, então essas funções não retornam nada, elas apenas saltam
Elias Van Ootegem
26

Não, o retorno não é necessário.

Mas nenhum retorno realmente devolver oundefined

rapsódia
fonte
6

Cada função Javascript deve retornar um valor?

Não, eles não querem. É verdade que no fundo da especificação, todos são ligeiramente diferentes:

function foo() {
}
function foo() {
    return;
}
function foo() {
    return undefined;
}

... mas o resultado de chamar cada um deles é o mesmo: undefined. Então, em termos pragmáticos:

  1. Você não tem que escrever um return, você pode apenas deixar a execução do código "cair do fim" da função
  2. Se você está voltando undefined, especificamente, basta escreverreturn;
  3. Ao chamar uma função, você não pode dizer (no código) se a execução caiu no final, terminou com return;ou terminou com return undefined;; todos parecem exatamente iguais ao seu código de chamada

Sobre a especificação: Especificamente, quando a execução de uma função sai do fim, na especificação é uma conclusão "normal"; mas return;e return value;são ambas conclusões de "retorno" com um valor associado ( undefined), que é (ligeiramente) diferente. Mas a diferença é eliminada pela semântica de chamar uma função , que diz:

...

  1. Se result . [[Type]] for return, retorne NormalCompletion ( result . [[Value]]).
  2. ReturnIfAbrupt ( resultado ).
  3. Retorna NormalCompletion ( indefinido ).

Portanto, não há diferença que você possa observar no código.

TJ Crowder
fonte
2

Não, você não precisa retornar algo para cada função. É opcional e depende de como você escreve a lógica do código.

Mohkhan
fonte