¿Cada función de Javascript tiene que devolver un valor?

Resuelto trejder asked hace 11 años • 4 respuestas

Estoy usando Netbeans para agregar comentarios de tipo profesional a cada función que escribo. Entonces comienzo cada uno de ellos /**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 agregaba @returns {type}parte en el esquema de comentarios únicamente, si la siguiente función de PHP realmente incluía returnuna declaración. En los llamados "procedimientos" (funciones que no devuelven ningún valor) faltaba esta parte.

Hoy intenté lo mismo con la función Javascript y Netbeans agregó @returns {undefined}una parte al esquema de comentarios a pesar de que la siguiente función no devuelve nada.

Esto me confundió. ¿Netbeans sugiere de esta manera que cada función de Javascript tiene que devolver algo? ¿Qué tengo que hacer? ¿Ignorar (o eliminar) esa parte del esquema de comentarios o seguir la sugerencia (si es que se trata de una sugerencia) y agregarla return false;al final de dicha función, aunque sea inútil para mí?

trejder avatar Jun 27 '13 14:06 trejder
Aceptado

La respuesta corta es no.

La verdadera respuesta es sí: se debe notificar al motor JS que alguna función ha finalizado su actividad, lo cual se realiza cuando la función devuelve algo. Esta es también la razón por la que, en lugar de "terminada" , se dice que una función "ha regresado" .
Una función que carece de una declaración de retorno explícita devolverá undefined, como se dice que una función C(++) que no tiene valor de retorno (y su firma lo refleja) devolverá 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 idiomas, puedes simplemente ignorar el valor de retorno de una función, lo cual 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 algún nivel muy bajo, el retorno se traduce en una especie de salto. Si una función realmente no devolviera nada en absoluto, no habría forma de saber qué y cuándo llamar a la siguiente función, o llamar a controladores de eventos y similares.

En resumen: 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 regresa implícitamente, su valor de retorno siempre será indefinido.

Elias Van Ootegem avatar Jun 27 '2013 07:06 Elias Van Ootegem

No, returnno es necesario.

Cuando no returnse especifica ninguna declaración, undefinedse devuelve.

rhapsodyn avatar Jun 27 '2013 07:06 rhapsodyn

¿Cada función de Javascript tiene que devolver un valor?

No, no lo hacen. Es cierto que en lo más profundo de la especificación, todos estos son ligeramente diferentes:

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

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

  1. No es necesario escribir un archivo return, simplemente puede dejar que la ejecución del código "caiga del final" de la función.
  2. Si regresas undefined, específicamente, puedes simplemente escribirreturn;
  3. Al llamar a una función, no se puede saber (en el código) si la ejecución finalizó, terminó con return;o terminó con return undefined;; Todos se ven exactamente iguales según tu código de llamada.

Con respecto a la especificación: específicamente, cuando la ejecución de una función falla al final, en la especificación se trata de una finalización "normal"; pero return;y return value;son ambas finalizaciones de "devolución" con un valor asociado ( undefined), que es (ligeramente) diferente. Pero la diferencia se elimina mediante 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 ninguna diferencia que puedas observar en el código.

T.J. Crowder avatar Jun 27 '2018 09:06 T.J. Crowder