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?


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

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.


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


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.