¿Cada función de Javascript tiene que devolver un valor?
Estoy usando Netbeans para agregar comentarios de tipo profesional a cada función que escribo. Entonces comienzo cada uno de ellos /**
y luego presiono Enter
para 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 return
una 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í?
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 return
declaración o implícitamente. Si una función regresa implícitamente, su valor de retorno siempre será indefinido.
No, return
no es necesario.
Cuando no return
se especifica ninguna declaración, undefined
se devuelve.
¿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:
- No es necesario escribir un archivo
return
, simplemente puede dejar que la ejecución del código "caiga del final" de la función. - Si regresas
undefined
, específicamente, puedes simplemente escribirreturn;
- Al llamar a una función, no se puede saber (en el código) si la ejecución finalizó, terminó con
return;
o terminó conreturn 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:
...
- Si el resultado .[[Tipo]] es
return
, devuelve NormalCompletion ( resultado .[[Valor]]).- ReturnIfAbrupt( resultado ).
- Devuelve NormalCompletion ( indefinido ).
Entonces no hay ninguna diferencia que puedas observar en el código.