JavaScript de Cero a Experto / JS funcional
Funciones puras: el corazón del estilo funcional
La programación funcional suena académica, pero su idea central cabe en una frase: escribir la mayor parte de tu programa con funciones que NO mienten — mismo dato entra, mismo resultado sale, y nada más cambia en el universo. Esas funciones se llaman puras, y aprender a distinguirlas cambia cómo escribes (y cómo depuras) para siempre.
La máquina expendedora
Las dos condiciones (y sus trampas)
Pura = cumple AMBAS: 1) su resultado depende SOLO de sus parámetros (determinismo), y 2) no modifica NADA fuera de ella (cero efectos secundarios). Míralas fallar por separado:
Las impurezas obvias son fáciles: tocar el DOM, hacer fetch, escribir
console.log. Las camufladas son las que muerden: leer una variable
externa cambiante (condición 1), mutar un parámetro (condición 2 — el
más común, como marcarCaros), y las fuentes de azar y tiempo:
Math.random() y Date.now() hacen impura cualquier función que los use,
porque el mismo input ya no garantiza el mismo output.
¿Y qué gano? Tres pagos concretos
Puedes razonar en frío. Para entender totalizar no necesitas saber
qué pasó antes ni qué hay en ninguna variable global: entra el array, sale
la suma. En un bug a las 11 pm, eso es oro.
Puedes testear sin montaje. expect(totalizar(gastos)).toBe(43000) —
sin preparar DOM, sin simular servidores, sin limpiar después. En el
módulo 16 escribirás tests de verdad y las funciones puras serán las
primeras en la fila (spoiler: la gamificación de esta plataforma — XP,
rachas, niveles — está escrita como funciones puras exactamente por esto).
Puedes confiar en el caché. Si el resultado solo depende del input,
puedes guardarlo y no recalcular (memoización — la verás en React como
useMemo).
Nota honesta obligatoria: un programa 100% puro no sirve para nada — algo tiene que pintar la pantalla, guardar el dato, hablar con la API. La meta real es el sánduche: un núcleo grande de lógica pura (cálculos, transformaciones, decisiones) entre dos panes delgados de impureza controlada (leer del mundo, escribir al mundo). Tu reto del módulo 10 ya tenía esa forma sin decirlo: fetch afuera, transformación adentro, pintado afuera.
function registrar(gastos, nuevo) { gastos.push(nuevo); return gastos; } — recibe todo por parámetros y no usa nada global. ¿Es pura?
Mini-reto
Auditoría de pureza sobre "Mi Bolsillo": escribe cuatro funciones —
promedio(gastos) (pura), masCaro(gastos) (pura, con reduce),
agregarGasto(gastos, gasto) (pura: spread, original intacto — verifica
con console.log del original después) y una cuarta a propósito impura,
sorteo(gastos) que use Math.random para elegir un "gasto premiado".
Etiqueta cada una con un comentario // pura / // impura: razón — el
músculo de HOY es diagnosticar.
Qué sigue
La pureza tiene una compañera inseparable que ya asomó en el playground:
no mutar NADA — ni parámetros, ni estado, nunca. En el módulo 4 conociste
las herramientas (spread, toSorted); la próxima lección las convierte
en estilo de vida: inmutabilidad como regla, y los pagos enormes que da.