11

Escribo código JavaScript e intento utilizar su naturaleza de lenguaje funcional.¿Debo dar siempre un valor de retorno a mi función?

En otros idiomas funcionales (o incluso en Ruby), si no establezco explícitamente el valor de retorno de una función, devolverá el valor de la última expresión evaluada. JavaScript no sigue este patrón. (Para ser precisos, JavaScript siempre devuelve también un valor. Si no se configuró nada, entonces undefined.)

Mi pregunta es la siguiente: Tengo una función que no necesita (y no) devuelve un valor . ¿Tiene sentido en un contexto de programación funcional tener una función sin valor de retorno explícito? ¿O falló en algún lugar si me encontré en este caso?

Por ejemplo, tengo la siguiente función. Comprueba periódicamente si se cambió la ubicación hash, y si es así, llama a la función dada.

LIB_hashManager = function(f, context) { 
    var prev = ''; 
    var pollHash = function() { 
     if (prev !== window.location.hash) { 
      prev = window.location.hash; 
      f.apply(context); 
     } 
    }; 
    window.setInterval(pollHash, 100); 
}; 

¿Debo devolver algo aquí?

actualización

En tanto que vino a mi mente, que si en cualquier momento en el futuro voy a tener que ampliar el conocimiento de LIB_hashManager, siguiendo el patrón constructor funcional, simplemente me puedo añadir métodos a un objeto y LIB_hashManager devolverá ese objeto producido.

LIB_hashManager = function(f, context) { 
    // inside logic 
    // ... 
}; 

Y más tarde se me permite escribir:

LIB_hashManager = function(f, context) { 
    // inside logic 
    // ... 

    // return public methods 
    return { 
     // ... 
    } 
}; 

Así que no tiene sentido entonces para devolver un objeto vacío en el primer caso?

Respuesta

18

Un entorno de programación funcional "puro" no tendría efectos secundarios; el trabajo de cada función sería en su totalidad al calcular su valor de retorno; eso no es realmente factible en los usos típicos de Javascript, por lo que es perfectamente aceptable, cuando una función ha hecho su trabajo a través de efectos secundarios, para que no devuelva nada, es decir, sea un "procedimiento" en lugar de una función.

+15

Como dijo uno de los creadores de Haskell (parafraseando) "Si toda tu máquina funcionara con un enfoque puramente funcional, entonces todo lo que obtendrías sería una caja caliente, nunca verías los resultados había calculado ". :) –

2

Está perfectamente bien tener una función que no devuelve nada. De hecho, forzar una función que naturalmente no tendría un valor de retorno para tener una es incómoda y huele mal.

+0

Si no tiene un valor de retorno, entonces no es una función, incluso si se llama así en el idioma que estamos hablando. – Ingo

5

Mi pregunta es la siguiente: Tengo una función que no necesita (y no) devuelve un valor. ¿Tiene sentido en un contexto de programación funcional tener una función sin valor de retorno explícito? ¿O falló en algún lugar si me encontré en este caso?

De acuerdo con la descripción académica de una función: una función debe dar el mismo resultado dado una entrada. Una función que no tiene ningún resultado es absolutamente inútil, porque no se supone que las funciones tengan efectos secundarios.

Sin embargo, dado que los lenguajes de programación funcional a menudo necesitan al menos 1 efecto secundario, la convención de no devolver nada es devolver una unidad o "()". Dado que este concepto no existe en Javascript, no debería importarle, ya que Javascript no está fuertemente tipado de todos modos.

0

Si se supone que no debe usar el resultado de LIB_hashManager, creo que definitivamente debe devolver undefined (es decir, no tiene ninguna declaración de devolución).

Si se olvida esto y intenta utilizar el resultado de la función de todos modos es probable que acaba de obtener un error (lo cual está bien ya que sería un error de programación, un error!)

1

La función que produce solo el efecto secundario se puede considerar simplemente como un bloque de programa aislado, igual que el bloque de procedimiento. Como JS no tiene procedimientos, no hay nada de malo en usar una función como un bloque de procedimiento. La única excepción es que las funciones en JS también son objetos, así que tenga cuidado con el uso extensivo de tales 'funciones'.

En este caso, solo aumenta la legibilidad del programa.

0

Esta pregunta ha sido contestada hace más de 4 años, pero yo creo, la respuesta aceptada es mal


En el código dado, el autor establece intervalo y luego - que no proporciona ninguna forma de detenerlo

Y así, la respuesta debería ser: sí, usted debe devolver un valor desde esta función, y ese valor debe ser un objeto que le permite dejar de intervalo, que se inicia en el interior de la misma.

Al discutir los detalles de cómo se debe implementar esto está fuera de alcance. // puede hacerlo devolviendo el manejador de intervalos, para que pueda cancelarlo manualmente (vea el ejemplo 1) o devolviendo un objeto con un método que lo haga detrás de la escena (como .pause, .stop o .cancel). Alternativamente, ese objeto también puede permitir la reconfiguración en tiempo de ejecución del administrador de hash (como cambiar la frecuencia de intervalo).

Ejemplo 1 (simple):

LIB_hashManager = function(f, context) { 
    var prev = ''; 
    var pollHash = function() { 
     if (prev !== window.location.hash) { 
      prev = window.location.hash; 
      f.apply(context); 
     } 
    }; 
    return window.setInterval(pollHash, 100); 
}; 
Cuestiones relacionadas