Saltar al contenido principal
eLearner.app
Módulo 4 · Lección 4 de 416/32 en el curso~12 min
Lecciones del módulo (4/4)

Closures y ámbito

Una closure (cierre o clausura) es una función que "recuerda" las variables del ámbito (scope) en el que fue definida, incluso después de que ese ámbito haya terminado. Parece magia, pero es una consecuencia directa de las reglas del scope.

Ámbito en cadena (Scope chain)

Una función puede leer variables declaradas fuera de sí misma, subiendo por la cadena de scopes:

JS
const moltiplicatore = 10;

function moltiplicaPer10(n) {
  return n * moltiplicatore; // legge dalla closure
}

moltiplicaPer10(3); // 30

Fábrica de funciones (Factory)

El patrón más común: una función que devuelve otra función, "personalizada" con los parámetros recibidos.

JS
function creaSaluto(prefisso) {
  return function (nome) {
    return `${prefisso}, ${nome}!`;
  };
}

const ciao = creaSaluto('Ciao');
const buongiorno = creaSaluto('Buongiorno');

ciao('Anna'); // 'Ciao, Anna!'
buongiorno('Marco'); // 'Buongiorno, Marco!'

Cada llamada a creaSaluto crea un scope separado, con su propio prefisso.

Contador con estado privado

El ejemplo clásico: una closure que mantiene un contador sin exponerlo al exterior.

JS
function creaContatore() {
  let n = 0;
  return function () {
    n++;
    return n;
  };
}

const c = creaContatore();
c(); // 1
c(); // 2
c(); // 3

const c2 = creaContatore();
c2(); // 1  ← stato isolato!

n es privado: nadie fuera de la closure puede leerlo o modificarlo.

Pruébalo tú mismo

Ejercicio#js.m4.l4.e1
Intentos: 0Cargando...

Implementa una fábrica `makeCounter()` que devuelva una función: cada llamada a dicha función debe devolver un entero progresivo a partir de 1. Contadores diferentes deben ser independientes.

Cargando editor...
Mostrar pista

Declara n con let dentro de makeCounter, luego devuelve una función que haga ++n.

Solución disponible después de 3 intentos

Ejercicio de repaso

Ejercicio#js.m4.l4.e2
Intentos: 0Cargando...

Implementa `makeAdderWith(base)` que devuelva una función: dado un número n, devuelva base + n. Cada sumador debe recordar su propia base.

Cargando editor...
Mostrar pista

Devuelve una arrow function que use base del parámetro externo.

Solución disponible después de 3 intentos