Closures y Currying

Closures

Los closures en JavaScript son una característica poderosa y flexible del lenguaje que permite a una función acceder a variables desde su ámbito léxico, incluso después de que esa función haya terminado de ejecutarse. Esta propiedad permite crear funciones con estado privado y es útil en una variedad de casos. A continuación, se explican algunas funciones y usos comunes de los closures:

¿Qué es un Closure?

Un closure es una combinación de una función y el ámbito léxico (entorno) en el que se declaró esa función. En otras palabras, un closure se refiere a una función que "recuerda" el entorno en el que se creó.

Ejemplo Básico

function crearContador() {  
    let contador = 0;  
    return function() {    
        contador++;    
        return contador;  
    };
}
const contador1 = crearContador();
console.log(contador1()); // Salida: 1
console.log(contador1()); // Salida: 2
const contador2 = crearContador();
console.log(contador2()); // Salida: 1

En este ejemplo, crearContador devuelve una función que incrementa y devuelve la variable contador. La variable contador permanece accesible para la función interna incluso después de que la función externa haya terminado de ejecutarse.

Usos Comunes de los Closures

1. Encapsulamiento de Datos

Los closures permiten encapsular datos, creando una especie de "variables privadas". Esto es útil para evitar el acceso no autorizado o la modificación de datos internos.

2. Funciones de Retorno

Los closures se utilizan comúnmente para crear funciones que generan otras funciones con un comportamiento específico.

3. Callbacks y Event Handlers

Los closures son útiles en la programación asíncrona y los manejadores de eventos, ya que permiten que los callbacks recuerden el contexto en el que fueron creados.

Ventajas

  • Privacidad y Encapsulamiento: Las variables en un closure no son accesibles desde el ámbito global, lo que proporciona un mayor control sobre los datos internos.

  • Mantenibilidad: Los closures permiten organizar mejor el código, facilitando la lectura y el mantenimiento.

  • Reutilización de Código: Facilitan la creación de funciones y comportamientos reutilizables.

Consideraciones

  • Consumo de Memoria: Los closures pueden incrementar el uso de memoria ya que mantienen referencias a las variables del ámbito exterior. Es importante asegurarse de que los closures no se utilicen en exceso o se gestionen adecuadamente.

  • Depuración: Puede ser más difícil depurar código que hace un uso extensivo de closures, especialmente en aplicaciones grandes.Algo adicional también es que con los closures podemos crear valores que solo puedan ser accedidos por medio de métodos, que no van a estar disponibles fuera de esta función, es decir, variables privadas.

Curriying

Es la técnica que nos permite invocar una función con menos parámetros de los que esperaría inicialmente, dejando para un momento posterior la especificación de esos parámetros ausentes.

const divisible = function (mod) {
  return function (num) {
    return num % mod;
  }
}

divisible(10)(2);
// or
const divisibleEn3 = divisible(3);
divisibleEn3(10);

Con currying se soluciona uno de los principios que todo programador busca cumplir que es DRY.

Nota: Falta un ejemplo mas avanzado

Last updated