¿Todas las funciones de Javascript tienen que devolver un valor?

99

Estoy usando Netbeans para agregar comentarios de tipo profesional a cada función, escribo. Entonces comienzo cada uno de ellos con /**y luego presiono Enterpara permitir que Netbeans cumpla con el esquema de comentarios predeterminado para la siguiente función.

Hasta ahora he estado usando esto solo para el lenguaje PHP y en este caso Netbeans siempre estaba agregando @returns {type}parte en el esquema de comentarios solo, si la siguiente función PHP realmente incluía una returndeclaración. En los llamados "procedimientos" (funciones que no devuelven ningún valor) esta parte faltaba.

Hoy probé lo mismo para la función Javascript y Netbeans agregó una @returns {undefined}parte al esquema de comentarios aunque la siguiente función no devuelve nada.

Esto me confundió. ¿Netbeans sugiere de esta manera que todas las funciones de Javascript deben devolver algo? ¿Qué tengo que hacer? Ignore (o elimine) esa parte del esquema de comentarios o siga la sugerencia (si es una sugerencia) y agregue return false;al final de dicha función, aunque es inútil para mí.

trejder
fuente
6
Si no se especifica ningún valor de retorno, JavaScript regresará undefined. En muchos idiomas se devuelve el resultado de la última declaración (más útil, en mi opinión). Estos se denominan devoluciones implícitas .
Zaz
¿Responde esto a tu pregunta? ¿Tengo que devolver algo en la función javascript?
cOborski

Respuestas:

189

La respuesta corta es no.

La respuesta real es sí: el motor JS debe ser notificado de que alguna función ha terminado su actividad, lo que se realiza mediante la función que devuelve algo. Esta es también la razón por la que, en lugar de "finalizada" , se dice que una función "ha regresado" .
Una función que carece de una declaración de retorno explícita regresará undefined, como se dice que una función C (++) que no tiene valor de retorno (y su firma refleja esto) devuelve 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
}

Además, en JS, como en la mayoría de los lenguajes, puedes simplemente ignorar el valor de retorno de una función, lo que se hace muchísimo:

(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

En un nivel muy bajo, el retorno se traduce en una especie de salto. Si una función realmente no devolvió nada , no habría forma de saber qué y cuándo llamar a la siguiente función, o llamar a los controladores de eventos y similares.

Entonces, para recapitular: No, una función JS no necesita devolver nada en lo que respecta a su código. Pero en lo que respecta a los motores JS: una función siempre devuelve algo, ya sea explícitamente a través de una returndeclaración o implícitamente. Si una función devuelve implícitamente, su valor devuelto siempre será indefinido.

Elias Van Ootegem
fuente
5
No creo que C ++ (o C) "devuelva un vacío". La etiqueta "void" indica que no devuelve nada. Sin embargo, es un punto menor y no tiene nada que ver con la pregunta.
Jay
2
No realmente volver void, no devuelve nada, pero su firma refleja esto a través del voidtipo de retorno.
Elias Van Ootegem
¿Existen beneficios de rendimiento para un retorno explícito frente a un retorno implícito?
4m1r
@ 4m1r: No lo sé, probablemente dependa del motor. Si hay una diferencia de rendimiento, lo más probable es que sea insignificante. retorno implícito vs return;probablemente solo sea útil si necesita regresar antes. la escritura return undefined;puede producir resultados diferentes si se undefinedresuelve en un valor diferente. La mayoría (si no todos) de los navegadores arrojarán un error cuando intente reasignar indefinido, pero en teoría, es posible que aquí tengamos un ejemplo usando node.js
Elias Van Ootegem
1
@SebastianLasse: Me refería voiden otros lenguajes (como C), donde puedes tener funciones como void do_someting(int *arg), pero no puedes tener una variable con el tipo void. En C, voidno es realmente un tipo, por lo que estas funciones no devuelven nada, simplemente saltan
Elias Van Ootegem
26

No, vuelve no es necesaria.

Pero no hay retorno en realidad devuelve elundefined

rapsodia
fuente
6

¿Todas las funciones de Javascript tienen que devolver un valor?

No, no lo hacen. Es cierto que en el fondo de la especificación, todos son ligeramente diferentes:

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

... sino el resultado de llamar a cada uno de ellos es el mismo: undefined. Entonces, en términos pragmáticos:

  1. No tiene que escribir un return, simplemente puede dejar que la ejecución del código "caiga al final" de la función
  2. Si regresa undefined, específicamente, simplemente escribareturn;
  3. Cuando se llama a una función, no se puede decir (en código) si la ejecución cayó al final, terminó con return;o terminó con return undefined;; todos se ven exactamente iguales a su código de llamada

Re la especificación: Específicamente, cuando la ejecución de una función cae al final, en la especificación eso es una finalización "normal"; pero return;y return value;ambos son finalizaciones de "retorno" con un valor asociado ( undefined), que es (ligeramente) diferente. Pero la diferencia es eliminada por la semántica de llamar a una función , que dice:

...

  1. Si el resultado . [[Tipo]] es return, devuelve NormalCompletion ( resultado . [[Valor]]).
  2. ReturnIfAbrupt ( resultado ).
  3. Devuelve NormalCompletion ( indefinido ).

Entonces no hay diferencia que puedas observar en el código.

TJ Crowder
fuente
2

No, no es necesario que devuelva algo para cada función. Es opcional y depende de cómo escriba su lógica de código.

mohkhan
fuente