Sitemap
Como cuando entiendo una hof

Hof’s, clousures y callbacks para ser feliz en javascript.

8 min readSep 18, 2021

--

Hola , en este tutorial quiero desmantelar que que cosas se esconden detrás de esta función.

Press enter or click to view image in full size
😜

Bien pero antes de pasar a entender hay que aclarar algunas preguntas como.

¿Qué es esta función?

Es tipo de funciones se les suele llamar HOC Higher-Order-function la cual es una función que puede tomar como parametro una función y retornar una función.

¿Cual es el trabajo de esta función?

En este caso la función wrapFetch tiene como objetivo agregar un poco más de funcionalidad al fetch común y el parámetro que recibe seria el tipo de fetch (el cual es una función) que estemos usando.

Por ejemplo si estuviéramos en node js (server):

Press enter or click to view image in full size

Y si estuviéramos en el navegador:

De esta manera hemos puesto un wrapper a fetch el cual agrega un header y transforma el body en json.

Bien pero vamos a ver algunos conceptos que están dentro de esta función, los que mencionare serán:

  • Callback
  • Clousure
  • Hof

Antes de empezar. Durante este tutorial estare utilizando un proyecto base con vite el cual tiene unas cuantas funciones que pueden ayudar ha hacer mas entretenido el tutorial. Puedes clonar el repositorio aqui.

Callback:

Una función callback es una función que se pasa a otra función como un argumento, para que luego pueda ser invocado desde la función externa para poder completar algún tipo de rutina o acción.

Press enter or click to view image in full size

la función myFuntion es una función común y corriente que al pasarse a setTimeout este la ejecutara justo después de 3 segundos.

Press enter or click to view image in full size

Claro también podríamos hacer lo siguiente:

Press enter or click to view image in full size

Pero esto ya sería un función anónima . En javascript una función es un objeto y podemos guardarlo en variables. Los tipos básicos como:

  • String,
  • Number
  • Boolean

pueden integrarse a la lógica del código sin necesidad de guardarlos en variables:

lo mismo podemos hacer con funciones:

Press enter or click to view image in full size

Pero en este caso esto no tiene sentido a menos que se auto-ejecute inmediatamente al ser creada.

Press enter or click to view image in full size

Los callbacks hacen un gran rol dentro de la programación asíncrona como en el caso anterior nuestro callback se agregara al Call Stack justo cuando pasen los 3 segundos sin interrumpir el hilo de ejecución.

Press enter or click to view image in full size

Salida:

Press enter or click to view image in full size

Podríamos seguir viendo los callbacks pero puede que quede muy amplio esto.

Clousures:

Javascript es muy guapo y una de las características que lo hace guapo son los clousures y ahora veraz por que.

¿Que son los clousures?

los clousures es una caracteristica de javascript que permiten a las funciones dentro de funciones tener acceso a su escope padre incluso antes de que este se haya cerrado.

Un ejemplo sencillo sería el siguiente:

Press enter or click to view image in full size

Nuestra función counter tiene dos funciones dentro, las cuales aumenta la cantidad o disminuyen la cantidad respectivamente lo maravilloso de esto es que al ejecutarse esta función me retorna estas dos funciones.

Press enter or click to view image in full size

Ahora podemos usar estas funciones para aumentar el contador. En otros lenguajes normalmente las variables locales solo están disponible al momento de la ejecución entonces sum y rest no tendrían acceso a count , pero este no es el caso de javascript al momento de la creación de las funciones guardan referencia de todas las variables de su alcance léxico.

¿Que es el alcance léxico?

Este vendría hacer el concepto de que un grupo anidado de funciones las funciones internas tienen acceso a las variables y otros recursos de su alcance principal.

Press enter or click to view image in full size

En un clousure este alcance existe incluso al momento de ejecutar la función padre osea podemos retornar esas funciones, ejecutarlas después y aún así tener acceso a su alcance léxico.

Press enter or click to view image in full size

Y para obtener el mismo resultado anterior podemos hacer lo siguiente:

Press enter or click to view image in full size

lo cual sería equivalente a :

Press enter or click to view image in full size

Salida:

Press enter or click to view image in full size

Bien ahora volvamos a la función count. Ya podemos entender porque sum y rest pueden acceder a count, podemos verlo en acción agregando dos botones.

Press enter or click to view image in full size

Salida:

Press enter or click to view image in full size

Hof:

Ahora si pasamos a ver que es una Hof. Una hof no es nada más que funciones que hacen cosas con otras funciones ya sea recibiendo una función como parámetro (callback) o retornando una función.

Si bien normalmente podemos abstraer parte lógica a través de funciones.

Press enter or click to view image in full size

Con una Higuer Order function podemos abstraer acciones y no solo valores.

Press enter or click to view image in full size

Veamos que esta haciendo esta función

  1. Esta función recibe un parámetro el cual es una función (callback).
  2. El valor devuelto es una función anónima el cual recibe cualquier cantidad de argumentos y los retorna como un array. Esta función sera el nuevo “sum”.
  3. Antes de ejecutar la verdadera función imprimimos un mensaje.
  4. Ejecutamos la verdera función y obtenemos el resultado.
  5. Pero antes de entregar este resultado vamos mostrar los parámetros de entrada, el nombre de la función y el resultado.
  6. Ahora si retornamos el resultado.

Podemos decir que noise podría ser aquel hacker que implanta algo malicioso en su víctima y está obteniendo los datos sin que esta se de cuenta dé hecho podríamos plantearlo así.

Press enter or click to view image in full size

Salida:

Press enter or click to view image in full size

la suma se sigue haciendo pero ademas estamos imprimiendo algunas valores antes de la función, si bien esta función no es muy aplicado a la realidad podríamos ver un ejemplo que si.

Press enter or click to view image in full size

El método map junto a otros métodos que facilitan el trabajo con arrays como los son reduce, filtero reduce,son funciones de alto nivel por la sencilla razón que reciben funciones como argumentos.

SI quisiéramos ver como este funciona seria de la siguiente manera:

Press enter or click to view image in full size

En este caso map es independiente no esta ligado al objeto Array y lo que hace es recibir un arreglo y ejecutar el callback por cada elemento de este.

Press enter or click to view image in full size

Bien, pero podemos un poco más allá esto, por ejemplo que pasaría si yo quiero reutilizar ese callback y aplicarlo a otros arrays.

Press enter or click to view image in full size

Para eso he creado esta función que al pasarle un callback me devuelve una función que recibe un array el cual a su vez devuelve un arreglo pero pasado por map con el callback de la primera función. Pero, ¿en qué ayuda esto?.

Press enter or click to view image in full size

Ahora hemos podido reutilizar la función para cualquier tipo de array, claro que aquí el ejemplo es muy sencillo. Ahora imaginemos que se quiere obtener todos los pares.

Press enter or click to view image in full size

Ahora even nos va ayudar a poder obtener los pares de cualquier array de números. Podemos probar los métodos de la siguiente manera:

Press enter or click to view image in full size

Salida:

Press enter or click to view image in full size

Fantástico, pero se podría hacer un poco más divertido , puede que esto amountOne(even(nums))en algún momento nos llegue a confundir. Asi que crearemos una función que lo haga mas entendible.

Press enter or click to view image in full size

Con esto lo que hacemos es tomar las funciones e ir aplicándolas de derecha a izquierda.

Press enter or click to view image in full size

Salida:

Press enter or click to view image in full size

Bien ahora si podemos volver a la primera función con todo lo suficiente para entenderlo.

Press enter or click to view image in full size

WrapFetch es una función que recibe una función (el fetch original) y devuelve una función que recibe los mismos parámetros que esta, a diferencia que esta la función recibe un json en el body y devuelve un json y así ahorraría hacer este procedimiento en cada petición y ademas podría reutilizarlo tanto en el servidor como en el navegador.

Conclusiones:

  • Cuando me hablan de una función anónima no es nada más que una función sin nombre.
  • Clousures es una característica de javascript que le permite a las funciones acceder a las variables incluso después de que el escope en el que se ha declarado se cierre.
  • Una hof es cualquier función que opera otras funciones ya sea recibiéndolas como parámetro o devolviéndolas.
  • Un callback es una función que se pasa como parámetro a otra función para ser ejecutada dentro de la función externa para completar un cierto trabajo o rutina.

--

--

leobar 37
leobar 37

Written by leobar 37

Soy un desarrollador autodidacta :)

No responses yet