CodeForge

JavaScript de Cero a Experto / JS funcional

Funciones puras: el corazón del estilo funcional

Teoría20 min20 XP

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.