Avatar ·

¿Cómo funcionan los closures en JavaScript? Explícalo con un ejemplo sencillo

¡Hola a todos! Acabo de empezar a estudiar JavaScript y no logro entender el tema de los closures. Leí varios artículos, pero sigo confundido. Por ejemplo, tengo este código:
function counter() {
    let count = 0;
    return function() {
        count++;
        return count;
    };
}

const myCounter = counter();
console.log(myCounter()); // 1
console.log(myCounter()); // 2
console.log(myCounter()); // 3
¿Por qué la variable count no se reinicia cada vez? La función counter() ya terminó su ejecución, pero aún podemos modificar su variable interna. Esperaba que después de la primera llamada a myCounter(), la variable count se destruyera, ya que está declarada dentro de la función. Y otra pregunta: ¿para qué sirven los closures? ¿En qué situaciones reales se aplican? Agradecería una explicación sencilla con ejemplos, preferiblemente en español. ¡Gracias de antemano! <<>>

¿Qué es un closure y cómo funciona?

Un closure es una función que recuerda el entorno en el que fue creada, incluso después de que ese entorno haya terminado de ejecutarse. En JavaScript, cuando una función se define dentro de otra función, la función interna tiene acceso a las variables de la función externa, y ese acceso se mantiene incluso si la función externa ya ha finalizado.

En tu ejemplo, cuando llamas a counter(), se crea la variable count y se devuelve una función interna. Esta función interna forma un closure que "captura" la variable count. Aunque counter() ya terminó, el closure mantiene una referencia a count en memoria, por lo que cada vez que llamas a myCounter(), se incrementa el mismo count.

Los closures son útiles para crear variables privadas, funciones de fábrica, y para mantener estado entre llamadas, como en contadores, memoización o manejadores de eventos.