<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Christian Perez - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Christian Perez - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sun, 07 Jun 2026 19:44:24 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/author/christian/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ ¿Qué es la programación funcional? Una guía de JavaScript para principiantes ]]>
                </title>
                <description>
                    <![CDATA[ JavaScript es un lenguaje de múltiples paradigmas y se puede escribir siguiendo diferentes paradigmas de programación. Un paradigma de programación es esencialmente un conjunto de reglas que se siguen al escribir código. Estos paradigmas existen porque resuelven los problemas a los que se enfrentan los programadores y tienen sus propias ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/que-es-la-programacion-funcional-una-guia-de-javascript-para-principiantes/</link>
                <guid isPermaLink="false">6001cca8a4e0700982a9d89f</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Christian Perez ]]>
                </dc:creator>
                <pubDate>Thu, 11 Mar 2021 08:00:25 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/03/photo-1516259762381-22954d7d3ad2-1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>JavaScript es un lenguaje de múltiples paradigmas y se puede escribir siguiendo diferentes paradigmas de programación. Un paradigma de programación es esencialmente un conjunto de reglas que se siguen al escribir código.</p><p>Estos paradigmas existen porque resuelven los problemas a los que se enfrentan los programadores y tienen sus propias reglas e instrucciones para ayudarte a escribir mejor código.</p><p>Cada paradigma te ayuda a resolver un problema específico. Por eso es útil tener una descripción general de cada uno de ellos. Aquí vamos a cubrir la programación funcional.</p><p>Al final de este artículo, hay algunos recursos que puedes utilizar para ir más allá si te ha gustado esta introducción.</p><p>También hay un glosario en GitHub que te ayudará a decodificar toda esta jerga que utiliza la programación funcional.</p><p>Por último, encontrarás un lugar en el cual ensuciarte las manos con ejemplos prácticos y un repositorio de GitHub con recursos que puedes utilizar para aprender más. Así que, vamos a por ello.</p><h2 id="paradigmas-de-programaci-n-declarativos-vs-imperativos">Paradigmas de programación declarativos vs imperativos</h2><p>Un ejemplo de estos paradigmas de los que hablé al principio, es la programación orientada a objetos. Otro es la programación funcional.</p><p>¿Entonces que es exactamente la programación funcional?</p><p>La programación funcional es un sub-paradigma del <strong>paradigma de programación declarativa</strong>, con sus propias reglas a seguir al escribir código.</p><h3 id="-qu-es-el-paradigma-de-funci-n-declarativa">¿Qué es el paradigma de función declarativa?</h3><p>Si estás codificando en un lenguaje que sigue el paradigma declarativo, escribe código que especifique <strong>lo que quieres hacer, sin decir cómo</strong>.</p><p>Un ejemplo muy simple de esto es SQL o HTML:</p><pre><code class="language-sql">SELECT * FROM clientes</code></pre><pre><code class="language-html">&lt;div&gt;&lt;/div&gt;</code></pre><p>En los ejemplos de código anteriores, no estás implementando <code>SELECT</code> o cómo imprimir un <code>div</code>. Simplemente le estás diciendo a la computadora <em>qué</em> hacer, sin el <em>cómo</em>.</p><p>De este paradigma, existen sub-paradigmas como la <strong>Programación funcional</strong>. Más de esto, en seguida.</p><h3 id="-qu-es-el-paradigma-de-programaci-n-imperativa"><strong>¿Qué es el paradigma de programación imperativa?</strong></h3><p>Si estás codificando en un lenguaje que sigue el paradigma imperativo / procedimental, escribes código que le dice <strong>cómo hacer algo.</strong></p><p>Por ejemplo, si haces algo como lo siguiente:</p><pre><code class="language-javascript">for (let i = 0; i &lt; arr.length; i++) {
     incrementar += arr[i];
}</code></pre><p>Le estás diciendo a la computadora exactamente lo que debe hacer. Itera a través del arreglo llamado <code>arr</code>, y luego <code>incrementar</code> cada uno de los elementos del arreglo.</p><h3 id="programaci-n-declarativa-vs-imperativa"><strong>Programación declarativa vs imperativa</strong></h3><p>Puedes escribir JavaScript en el <strong>paradigma declarativo</strong> o el <strong>paradigma imperativo.</strong> Esto es lo que la gente quiere decir cuando dice que es un lenguaje de paradigmas múltiples. Es solo que el código funcional sigue el <strong>paradigma declarativo.</strong></p><p>Si te ayuda a recordar, un ejemplo de un comando declarativo sería pedirle a la computadora que te prepare una taza de té (no me importa cómo lo hagas, solo tráeme mi taza de té).</p><p>Mientras que imperativamente, tendrías que decir:</p><ul><li>Ve a la cocina.</li><li>Si hay una tetera en la habitación y tiene suficiente agua para una taza de té, enciende la tetera.</li><li>Si hay una tetera en la habitación y no tiene suficiente agua para una taza de té, llena la tetera con agua suficiente para una de taza de té y enciende la tetera.</li><li><em>Y así sucesivamente.</em></li></ul><h3 id="-entonces-que-es-programaci-n-funcional"><strong>¿Entonces que es programación funcional?</strong></h3><p>¿Qué significa esto para código funcional?</p><p>Debido a que es un sub-paradigma del paradigma declarativo, esto afecta la forma en que escribes código funcional. Generalmente conduce a menos código, porque JavaScript ya tiene muchas de las funciones integradas que normalmente necesitas. Esta es una de las razones por las que a la gente le gusta el código funcional.</p><p>También te permite abstraer mucho (no tienes que entender en profundidad cómo se hace algo), simplemente llamas a una función que lo hace por ti.</p><p>¿Y cuáles son las reglas que llevan a código funcional?</p><p>Programación funcional puede ser explicada simplemente siguiendo estas dos reglas en tu código.</p><ol><li><strong>Diseña tu software a partir de funciones puras y aisladas</strong></li><li><strong>Evitar mutabilidad y efectos secundarios</strong></li></ol><p>Veamos que se trata eso.</p><h2 id="1-dise-a-tu-software-a-partir-de-funciones-puras-y-aisladas"><strong><strong>1. </strong>Diseña tu software a partir de funciones puras y aisladas</strong></h2><p>Empecemos por el principio,</p><p>Código funcional utiliza bastante algunas cosas:</p><h3 id="funciones-puras"><strong>Funciones puras</strong></h3><p>La misma entrada siempre da la misma salida (idempotencia) y no tiene efectos secundarios.</p><p>Una función idempotente es aquella que, cuando vuelve a aplicar los resultados a esa función nuevamente, no produce un resultado diferente.</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">/// Algunos ejemplos que utiliza Math.abs(retorna el valor absoluto de un numero)
Math.abs('-1');     // 1
Math.abs(-1);       // 1
Math.abs(null);     // 0


Math.abs(Math.abs(Math.abs('-1')));           // Sigue retornando 1
Math.abs(Math.abs(Math.abs(Math.abs('-1')))); // Sigue retornando 1</code></pre><figcaption>Ejemplo de función idempotente</figcaption></figure><p>Los efectos secundarios son cuando tu código interactúa con (lee o escribe) un estado mutable externo.</p><p>El estado mutable externo es literalmente cualquier cosa fuera de la función que cambiaría los datos en tu programa. ¿Establecer una función? ¿Establecer un booleano en un objeto? ¿Eliminar propiedades de un objeto? Todos los cambios de estado fuera de tu función.</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">function estaDisponible(){
	disponible = true;
}</code></pre><figcaption>Un ejemplo de estado mutable que se establece dentro de sus funciones.</figcaption></figure><h3 id="funciones-aisladas"><strong>Funciones aisladas</strong></h3><p>No dependen del estado del programa, que incluye variables globales que están sujetas a cambios.</p><p>Discutiremos esto más a fondo, pero todo lo que necesites debe pasarse a la función como argumento. Esto hace que tus dependencias (cosas que la función necesita para hacer su trabajo) sean mucho más claras de ver y más detectables.</p><p>¿Ok, porque hacemos así las cosas?</p><p>Sé que esto parecen muchas restricciones que hacen que tu código sea innecesariamente difícil. Pero no son restricciones, son pautas que intentan evitar que caigas en patrones que comúnmente conducen a errores.</p><p>Cuando no estás cambiando la ejecución de tu código, dividir tu código con <code>if's</code> basado en el estado del &nbsp;<code>booleano</code>, siendo establecido por múltiples lugares en tu código, hace que el código sea más predecible y es más fácil razonar sobre lo que está sucediendo.</p><p>Cuando sigas el paradigma funcional, encontrarás que el orden de ejecución de tu código no importa tanto.</p><p>Esto tiene bastantes beneficios: uno es, por ejemplo, que para replicar un error no es necesario saber exactamente cuál era el estado de cada <code>booleano</code> y <code>objeto</code> antes de ejecutar sus funciones. Siempre que tengas una pila de llamadas (sabes qué función se está ejecutando / se ha ejecutado antes), se pueden replicar los errores y resolverlos más fácilmente.</p><p><strong>Reusabilidad mediante funciones de orden superior</strong></p><p>Las funciones que se pueden asignar a una variable, pasar a otra función o devolver desde otra función como cualquier otro valor normal, se denominan <strong>funciones de primera clase.</strong></p><p>En JavaScript, todas las funciones son funciones de primera clase. Funciones que tienen un estado de primera clase nos permiten crear <strong>funciones de orden superior.</strong></p><p>Una <strong>función de orden superior</strong> es una función que toma una función como argumento, devuelve una función o ¡ambas cosas! Puedes usar funciones de orden superior para dejar de repetir código.</p><p>Algo así:</p><pre><code class="language-js">// Ejemplo no funcional
const edad = [12,32,32,53]
for (var i=0; i &lt; edad.length; i++) {
    edadFinal += edad[i];
}

// Ejemplo funcional
const edad = [12,32,32,53]
const edadTotal = edad.reduce( function(primerEdad, segundaEdad){
    return primerEdad + segundaEdad;
})

</code></pre><p>Las funciones de arreglos incluidas en JavaScript <code>.map</code>, <code>.reduce</code> y <code>.filter</code> aceptan una función. Son excelentes ejemplos de <strong>funciones de orden superior</strong>, ya que iteran sobre un arreglo y llaman a la función que recibieron para cada elemento del arreglo.</p><p>Así que podrías hacer lo siguiente:</p><pre><code class="language-js">// Ejemplos de cada uno
const arreglo = [1, 2, 3];

const arregloMap = arreglo.map(function(elemento){
    return elemento + 1;
});
// arregloMap es [2, 3, 4]

const reducido = arreglo.reduce(function(primero, segundo){
	return primero + segundo;
});
// reducido es 6

const filtrarArreglo = arreglo.filter(function(elemento){
    return elemento !== 1;
});
// filtrarArreglo is [2, 3]</code></pre><p>Pasar los resultados de funciones a otras funciones, o incluso pasar las funciones en sí, es extremadamente común en el código funcional. Incluí esta breve explicación debido a la frecuencia con la que se usa.</p><p>Estas funciones también se utilizan a menudo porque no cambian la función subyacente (no cambian el estado), sino que operan con una copia del <code>arreglo</code>.</p><p></p><h2 id="2-evitar-la-mutabilidad-y-los-efectos-secundarios-"><strong><strong>2. </strong></strong>Evitar la mutabilidad y los efectos secundarios.</h2><p>La segunda regla es evitar la mutabilidad - ya lo mencionamos brevemente antes, cuando hablamos de limitar los cambios al estado mutable externo - y sus efectos secundarios.</p><p>Pero aquí lo explicaremos mejor. Básicamente, todo se reduce a esto: ¡no cambies las cosas! Una vez que lo haz hecho, es inmutable (No cambiará más).</p><figure class="kg-card kg-code-card"><pre><code class="language-js">var edades = [12,32,32,53]
edades[1] = 12;  // no!
edades = [];     // no!
edades.push("2") // no!</code></pre><figcaption>Este código no lleva patrón funcional.</figcaption></figure><p>Si algo tiene que cambiar en tu estructura de datos, haz los cambios en una copia.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const edades = [12,32,32,53]
const edadesNuevas = edades.map(function (edad){
    if (edad == 12) { return 20; }
    else { return edad; }
})</code></pre><figcaption>Mucho mejor!</figcaption></figure><p>¿Vez que hice una copia con mis cambios necesarios?</p><p>Este elemento se repite una y otra vez. ¡No cambies el estado!</p><p>Si seguimos esa regla, haremos un uso intensivo de <code>const</code> para saber que las cosas no cambiarán. Pero tenemos que ir más allá. ¿Qué tal lo siguiente?</p><pre><code class="language-js">const objetoCambiante = {
    cambia: 10
}

objetoCambiante.cambia = 10;  // no!
delete obj.cambia      // no!
</code></pre><p>Las propiedades de <code>objetoCambiante</code> deberían estar completamente bloqueadas. <code>const</code> solo te protegerá de inicializar la misma variable.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const obj = Object.freeze({
    noCambia: 'Locked' }) // La función "freeze" aplica la inmutabilidad.

obj.noCambia = 0      // No cambia el objeto!
delete obj.noCambia   // No cambia el objeto!
obj.agregarProp = "Te la creiste!" // No cambia el objeto!</code></pre><figcaption>Utiliza estructuras de datos persistentes</figcaption></figure><p><br>Si no podemos cambiar el estado global de las variables, entonces debemos asegurarnos de:</p><ul><li>Declarar los argumentos de la función: cualquier cálculo dentro de una función depende solo de los argumentos y no de ningún objeto o variable global.</li><li>No modificar una variable u objeto: creamos nuevas variables y objetos y los devolvemos si es necesario, desde una función.</li></ul><h3 id="haz-que-tu-c-digo-sea-referencialmente-transparente"><strong>Haz que tu código sea referencialmente transparente</strong></h3><p>Cuando sigues la regla de nunca cambiar de estado, tu código se vuelve referencialmente transparente. Es decir, tus llamadas a funciones se pueden reemplazar con los valores que representan, sin afectar el resultado.</p><p>Como un ejemplo simple de verificar si tu código es <strong>referencialmente transparente,</strong> mira el siguiente fragmento de código:</p><pre><code class="language-js">const conoceAutor = function(){
    return 'Hola Kealan'
}</code></pre><p>Deberías poder simplemente intercambiar esa llamada a la función con la <code>cadena</code> que devuelve y no tener problemas.</p><p>La programación funcional con expresiones referencialmente transparentes te hace comenzar a pensar en tu código de manera diferente si estás acostumbrado a la <strong>orientación a objetos.</strong></p><p>¿Pero, por qué?</p><p>Porque en lugar de objetos y estados mutables en tu código, comienzas a tener funciones puras, sin cambios de estado. Entiendes claramente lo que esperas que devuelva tu función (ya que nunca cambia, cuando normalmente podría devolver diferentes tipos de datos dependiendo del estado fuera de la función).</p><p>Puede ayudarte a comprender mejor el flujo, comprender lo que está haciendo una función con solo escanearla y ser más riguroso con las responsabilidades de cada función para crear mejores sistemas desacoplados.</p><p>Puedes aprender más acerca de transparencia referencial <a href="https://es.wikipedia.org/wiki/Transparencia_referencial#:~:text=La%20transparencia%20referencial%20es%20un,diferir%20de%20la%20del%20original%22.">aquí.</a></p><h3 id="no-hagas-iteraciones"><strong>No hagas iteraciones</strong></h3><p>Con suerte, si has prestado atención hasta ahora, verás que no estamos cambiando el estado. Así que para aclarar, abandonaremos los bucles <code>for</code> :</p><pre><code class="language-js">for(let i = 0; i &lt; arr.length; i++) {
    total += arr[i];
}</code></pre><p>Porque estamos cambiando el estado de una variable. Utiliza en vez, la función de orden superior <code>map</code>.</p><h2 id="m-s-caracter-sticas-de-la-programaci-n-funcional">Más características de la programación funcional</h2><p>Espero que hasta este punto tengas una buena descripción de lo que es y no es el código funcional. Pero hay algunos conceptos finales que se usan mucho en el código funcional y que tenemos que cubrir.</p><p>En todo el código funcional que he leído, estos conceptos y herramientas son los que más se utilizan, y tenemos que cubrirlos para obtener nuestro conocimiento fundamental.</p><p>Así que, aquí vamos.</p><h2 id="recursi-n-en-programaci-n-funcional"><strong>Recursión en programación funcional</strong></h2><p>Es posible que en JavaScript una función se llame a sí misma.</p><p>Lo que siempre hemos podido hacer:</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">function recurrir(){
    recurrir();
}</code></pre><figcaption>Tal vez, esta no sea la mejor idea.</figcaption></figure><p>El problema con esto, es que no es útil. Se ejecutará eventualmente hasta que bloquee tu navegador. Pero la idea de recursividad es una función que se llama a sí misma desde dentro. Veamos un ejemplo más útil:</p><pre><code class="language-js">function recurrir(inicio, fin){
    if (inicio == fin) {
        console.log(fin)
        return;
    } else {
        console.log(inicio)
        return recurrir(inicio+1, fin)
    }
}

recurrir(1, 10);
// 1, 2, 3, 4, 5, 6, 7, 8, 9, 10</code></pre><p>Este fragmento de código contará desde el argumento <code>inicio</code> hasta el argumento <code>fin</code>. Y lo hace volviendo a llamar a su propia función.</p><p>Así que el orden se verá algo así:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/11/image-135.png" class="kg-image" alt="image-135" width="600" height="400" loading="lazy"><figcaption>Un ejemplo de pila de llamadas para esta función recursiva.</figcaption></figure><p>Agregue un debugger dentro de los bloques <code>if</code> para seguir esto, por si no te hace mucho sentido. La recursividad es una herramienta que puedes utilizar para iterar en la programación funcional.</p><p>¿Qué hace que el primer ejemplo y el segundo ejemplo sean diferentes? El segundo tiene lo que llamamos <strong>"un caso base"</strong>. Un caso base permite que la función deje de llamarse a sí misma infinitamente. Cuando <code>inicio</code> es igual <code>fin</code>, podemos dejar de recurrir. Como sabemos, hemos contado hasta el final de nuestro ciclo.</p><p>Pero cada llamada de las funciones vuelve a llamar a su propia función y se suma al argumento de la función.</p><p>El ejemplo de código que acabo de incluir para el ejemplo de conteo, no es una <strong>función pura.</strong> ¿Por qué?</p><p> ¡Porque <code>console</code> es un estado! Y le hemos registrado <code>strings</code>.</p><p>Esta ha sido una breve introducción a la recursividad, pero siéntete libre de ir <a href="https://es.wikipedia.org/wiki/Recursi%C3%B3n_(ciencias_de_computaci%C3%B3n)">aquí </a>para obtener más información.</p><p><strong>¿Por qué utilizar la recursividad?</strong></p><p>Recursividad nos permite dejar de mutar las variables del estado, para empezar.</p><p>También hay ciertas estructuras de datos (estructuras de árbol) que son más eficientes cuando se resuelven con recursividad. Por lo general, requieren menos código, por lo que a algunos desarrolladores les gusta lo fácil que es leer la recursividad.</p><h2 id="currying-en-programaci-n-funcional">"<strong>Currying</strong>"<strong> </strong>en programación funcional</h2><p>"Currying" es otra herramienta muy utilizada en código funcional. La <strong>aridad </strong>de una función se refiere a cuántos argumentos recibe.</p><pre><code class="language-js">// Veamos aridad
function aridad2(arg1, arg2){}             // Función tiene una aridad de 2
function aridad0(){}                       // Función tiene una aridad de 0
function aridad2(arg1, arg2, arg3, arg4){} // Función tiene una aridad de 4</code></pre><p>Hacer <strong>c<strong>urrying</strong></strong> a una función convierte esta función que tiene una aridad de más de 1 en 1. Lo hace devolviendo una función interna para tomar el siguiente argumento. He aquí un ejemplo:</p><pre><code class="language-js">function suma(primerNum, segundoNum){
	return primerNum + segundoNum;
}

// "Haciendo curry" a esta función

function currySuma(primerNum){
	return function(segundoNum){
            return primerNum + segundoNum;
    }
}</code></pre><p>Esencialmente, reestructura una función para que tome un argumento, pero luego devuelve otra función para tomar el siguiente argumento, tantas veces como sea necesario.</p><h3 id="-para-que-usar-currying"><strong>¿Para que usar<strong> currying?</strong></strong></h3><p>El gran beneficio del currying es cuando necesitas reutilizar la misma función varias veces, pero solo cambiar uno (o menos) de los parámetros. Entonces puedes guardar la primera llamada a la función, algo como esto:</p><pre><code class="language-js">function currySuma(primerNum){
	return function(segundoNum){
            return primerNum + segundoNum;
    }
}

let suma10 = currySuma(10);
suma10(2); // Returns 12

let suma20 = currySuma(20);
suma20(2); // Returns 22</code></pre><p>Currying también puede hacer que tu código sea más fácil de refactorizar. No tienes que cambiar varios lugares donde estás pasando los argumentos de la función incorrectos, solo el lugar, donde enlazaste la primera llamada a la función al argumento incorrecto.</p><p>También es útil si no puedes proporcionar todos los argumentos a una función a la vez. Puede devolver la primera función para llamar a la función interna cuando tengas todos los argumentos más adelante.</p><h2 id="aplicaci-n-parcial-en-programaci-n-funcional">Aplicación parcial en programación funcional</h2><p>De manera similar, la aplicación parcial significa que aplicas algunos argumentos a una función a la vez y devuelve otra función que se aplica a más argumentos. Este es el mejor ejemplo que encontré en los documentos de MDN:</p><pre><code class="language-javascript">const modulo = {
  altura: 42,
  calcularAltura: function(altura) {
    return this.altura + altura;
  }
};

const aisladoCalcularAltura = modulo.calcularAltura;
console.log(aisladoCalcularAltura(32)); // La función se invoca desde el scope global
// salidas: NaN
// Salida NaN porque this.altura resulta undefined (en el scope de window) 
// undefined + 32 lo que retorna NaN

const unidoCalcularAltura = aisladoCalcularAltura.bind(modulo);
console.log(unidoCalcularAltura(32));
// Salida esperada: 74</code></pre><p><code>bind</code> es el mejor ejemplo de aplicación parcial. ¿Por qué?</p><p>Porque devolvemos una función interna que se asigna a unidoCalcularAltura que se llama, con este alcance configurado correctamente y un nuevo argumento pasado más tarde. No asignamos todos los argumentos a la vez, sino que devolvimos una función para aceptar el resto de los argumentos.</p><h3 id="-por-qu-utilizar-aplicaci-n-parcial">¿Por qué utilizar aplicación parcial?</h3><p>Puedes usar la aplicación parcial siempre que no puedas pasar todos sus argumentos a la vez, pero que puedas devolver funciones de orden superior para lidiar con el resto de los argumentos.</p><h2 id="composici-n-de-funciones-en-programaci-n-funcional">Composición de funciones en programación funcional</h2><p><br>El tema final que creo que es fundamental para el código funcional es la <strong>composición de funciones.</strong></p><p>La <strong>composición de funciones</strong> nos permite tomar dos o más funciones y convertirlas en una función que hace exactamente lo que hacen las dos funciones (o más).</p><pre><code class="language-javascript">// Si tenemos esta dos funciones

function suma10(num) {
	return num + 10;
}
function suma100(num) {
    return num + 100;
}

// Podemos componer estas dos a lo siguiente =&gt;
function compuesta(num){
	return suma10(suma100(num));
}

compuesta(1) // Retorna 111</code></pre><p><br>Puedes llevar esto más allá y crear funciones para componer cualquier número de funciones de aridad múltiples juntas si lo necesitas según sea el caso.</p><h3 id="-por-qu-usar-composici-n-de-funciones">¿Por qué usar composición de funciones<strong>?</strong></h3><p>La composición te permite estructurar tu código a partir de funciones reutilizables, para dejar de repetirte a ti mismo. Puedes comenzar a tratar las funciones como pequeños bloques de construcción que puedes combinar para lograr un resultado más complicado.</p><p>Estos luego se convierten en las "unidades" o el poder de cálculo en tus programas. Son muchas funciones pequeñas que funcionan genéricamente, todas compuestas en funciones más grandes para hacer el trabajo "real".</p><p>Es una forma poderosa de diseñar tu código y evita que crees funciones enormes copiadas y pegadas con pequeñas diferencias entre ellas.</p><p>También puede ayudarte a probar cuando tu código no está estrechamente acoplado. Y hace que tu código sea más reutilizable. Puedes simplemente cambiar la composición de tus funciones o agregar funciones más pequeñas a la composición, en lugar de tener todo el código copiado y pegado en todo el código base (para cuando necesites que haga algo similar pero no exactamente igual que otra función) .</p><p>El siguiente ejemplo es trivial para ayudarte a comprender, pero espero que veas el poder de la <strong>composición de funciones.</strong></p><pre><code class="language-javascript">/// Este es un ejemplo donde tenemos que copiar y pegar
function suma50(num) {
	return num + 50;
}

// Ok. Ahora necesitamos sumar 30. Pero, TAMBIEN todavia necesitamos sumar 50 en otro lugar 
// Entonces necesitamos una función
function suma30(num){
	return num + 30;
}

// Pff, las cosas vuelven a cambiar
function sumar20(num){
	return num + 20;
}

// Cada vez que necesitamos cambiar la función aunque sea un poco, necesitamos una función nueva.

//Usemos composición

// Nuestra pequeña, función pura reutilizable
function sumar10(num){
	return num + 10;
}

function suma50Compuesta(num){
	return sumar10(sumar10(sumar10(sumar10(sumar10(num)))));
}

function suma30Compuesta(num){
	return sumar10(sumar10(sumar10(num)));
}

function suma20Compuesta(num){
	return sumar10(sumar10(num));
}</code></pre><p>¿Ves cómo compusimos nuevas funciones a partir de funciones puras más pequeñas?</p><h2 id="conclusi-n"><strong><strong>Conclusi</strong>ó<strong>n</strong></strong></h2><p><br>Este artículo cubrió mucho. Pero espero que haya explicado el código funcional de manera simple, junto con algunos de los patrones repetidos que verás una y otra vez, en código funcional e incluso no funcional.</p><p>El código funcional no es necesariamente el mejor, y tampoco lo es el código orientado a objetos. El código funcional se usa generalmente para problemas más matemáticos como el análisis de datos. También es muy útil para sistemas en tiempo real de alta disponibilidad, como cosas escritas en Erlang (un lenguaje funcional). Pero realmente depende de un problema a otro.</p><h2 id="como-aprender-m-s">Como aprender más</h2><p>Puedes comenzar <a href="https://www.freecodecamp.org/espanol/learn/javascript-algorithms-and-data-structures/functional-programming/learn-about-functional-programming">aquí</a>, con la introducción de freeCodeCamp a programación funcional con JavaScript.</p><p>Aquí puedes encontrar librerías para practicar, y ser todo un pro en programación funcional.</p><p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/kealan/">Kealan Parr</a> - <a href="https://www.freecodecamp.org/news/functional-programming-in-javascript/">What is Functional Programming? A Beginner's JavaScript Guide</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como entender recursión en Javascript ]]>
                </title>
                <description>
                    <![CDATA[ > "Para entender recursión, uno primero debes entender recursión" - Desconocido Si eres como yo entonces probablemente no entendiste recursión la primera vez que leíste acerca de ella. Para mí, fue porque:  1. Recursión en sí misma, es un concepto difícil.  2. Algunos de los tutoriales y artículos ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-entender-recursividad-en-javascript/</link>
                <guid isPermaLink="false">5ff7706b8c7cd154bb9857ee</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Christian Perez ]]>
                </dc:creator>
                <pubDate>Tue, 23 Feb 2021 06:54:40 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/02/photo-1527266237111-a4989d028b4b-1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <blockquote>"Para entender recursión, uno primero debes entender recursión" - Desconocido</blockquote><p>Si eres como yo entonces probablemente no entendiste recursión la primera vez que leíste acerca de ella.</p><p>Para mí, fue porque:</p><ol><li>Recursión en sí misma, es un concepto difícil.</li><li>Algunos de los tutoriales y artículos que leí no eran muy claros.</li></ol><p>Por alguna razón, la mayoría de los artículos que explicaban recursión usaban el ejemplo de números factoriales y la secuencia de Fibonacci. Lo que significaba que tenía que entender como los números de Fibonacci funcionaban para después hacer la conexión a recursión.</p><p>Pero, vamos a tomar otro camino en este artículo.</p><h2 id="-qu-es-recursi-n">¿Qué<strong> es </strong>recursión<strong>?</strong></h2><p>En términos simples: recursión es cuando una función sigue llamándose a sí misma, hasta que ya no tiene que hacerlo.</p><p>¿Qué? Si, la función se sigue llamándose a sí misma, pero con una entrada más pequeña cada vez.</p><p>Piensa en recursión como una carrera en un circuito. Es como correr la misma pista una y otra vez, pero las vueltas se hacen más pequeñas cada vez. Eventualmente, correrás la vuelta más pequeña y se terminará la carrera.</p><p>Lo mismo con la recursión: La función sigue llamándose a sí misma, cada vez con una entrada menor hasta que eventualmente se detiene.</p><p>Pero, la función no decide por sí misma cuando parar. Nosotros le decimos cuando. Nosotros le damos a la función una condición conocida como <strong>caso base</strong>.</p><p>El caso base es la condición que le dice a la función cuando dejar de llamarse a sí misma. Es como decirle a la función cuál será la última vuelta de la carrera para que se detenga después de la última vuelta.</p><h2 id="ejemplos-de-recursi-n"><strong>Ejemplos de </strong>recursión</h2><p>Muy bien eso es recursión. Vamos a mirar algunos ejemplos para entender como funciona la recursión.</p><p>¿Recuerdas la primera vez que aprendiste acerca de los bucles (loops)? El primer ejemplo que hiciste probablemente fue un programa que hacia una regresiva. Vamos a hacer eso.</p><p>Primero, necesitamos entender que queremos que haga nuestro programa. Cuenta regresiva desde un número dado hasta el número más pequeño, restando 1 cada vez que pasa por el bucle.</p><p>Dado el número 5, esperamos que la salida sea algo así:</p><pre><code class="language-javascript">// 5
// 4
// 3
// 2
// 1</code></pre><p>Muy bien, ¿Cómo podemos programar este programa con recursión?</p><pre><code class="language-javascript">let cuentaAtras = numero =&gt; {
    //base case
    if (numero === 0) {
        return;
    }
    console.log(numero);
    return cuentaAtras(numero - 1);
};
console.log(cuentaAtras(5)) // 5, 4, 3, 2, 1</code></pre><p>¿Qué exactamente es lo que pasa aquí?</p><p>Si te diste cuenta, lo primero que hicimos fue definir el caso base. ¿Por qué? Porque la función primero que nada necesita saber cuándo dejará de llamarse a sí misma.</p><p>¿Nunca correrías una carrera sin saber primero que tan larga es, o si?</p><p>Si no le dices a la función cuándo detenerse, entonces sucederá algo llamado stackoverflow. La pila(stack) se va a llenar con funciones que se están llamando, pero que no regresan ni se quitan de la pila.</p><p>La parte de recursión sucede en la línea 7. Donde le decimos a la función que siga regresando, pero reduciendo sus entradas una cada vez que regresa.</p><p>Así que, efectivamente, esto es &nbsp;lo que sucede:</p><pre><code class="language-javascript">1// La entrada actual es 5
2// Es 5 igual a 0 ?
3// No, Ok entonces imprime 5 en la consola.
4// Se llama asi misma de nuevo con el numero - 1 O 5 - 1;
5// La entrada principal es 4
6// Es 4 igual a 0 ?
7// No, Ok entonces imprime 4 en la consola.
8// Repite hasta que la entrada sea 0, y asi la función deja de llamarse a si misma.</code></pre><p>Vale, eso tiene sentido. Vamos con otro ejemplo.</p><p>¿Sabes cómo podemos saber que un número es par usando el <a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Operadores/Aritm%C3%A9ticos#.25_.28modular.29">operador de residuo(%)</a>? Entonces, si cualquier número % 2 == 0 entonces ese número es par o si cualquier número % 3 == 0 entonces ese número es impar.</p><p>Bueno, resulta que existe otro método.</p><p>Si continuamente restamos dos a un número hasta que el número más pequeño sea 0(cero) o 1(uno) entonces podemos saber si el número es par o impar.</p><p>Intentemos eso con recursión. Entonces, dado el número 6, nuestro programa debería devolver 'Par' porque 6-2-2-2 = 0. Dado 7, nuestro programa debería devolver 'impar' porque 7-2-2-2 = 1.</p><p>Veamos el código.</p><pre><code class="language-javascript">let parImpar = (numero) =&gt; {
    if (numero === 0) {
        return 'Par';
    } else if (numero === 1) {
        return 'Impar';
    } else {
        return parImpar(numero - 2);
    }
};
console.log(parImpar(20)) // Par
console.log(parImpar(75)) // Impar
console.log(parImpar(98)) // Par
console.log(parImpar(113)) // Impar</code></pre><p>De nuevo, el primer paso fue decirle a la función cuándo dejar de llamarse a sí misma. Luego le dijimos qué hacer cuando se llama a sí misma.</p><p>Recursión es básicamente divide y conquista. Seguimos dividiendo el problema haciéndolo cada vez más pequeño.</p><h2 id="recursi-n-vs-bucles">Recursión<strong><strong> vs </strong>Bucles</strong></h2><p>Cuando se trata de velocidad, un bucle se ejecuta mucho más rápido que una función recursiva. También es más fácil escribir un bucle que una función recursiva. Y cuando se trata de legibilidad, es más fácil saber qué sucede con un bucle que con una función recursiva.</p><p>Pero, las funciones recursivas son muy elegantes.</p><p>Entonces, ¿Cuál es la mejor opción? ¿Eficiencia o velocidad?</p><p>Esta es una frase del libro E<em>loquent Javascript.</em></p><blockquote>Preocuparse por la eficiencia puede ser una distracción. Es otro factor más que complica el diseño del programa, y ​​cuando estás haciendo algo que ya es difícil, esa cosa extra de la que preocuparte puede ser paralizante. Por lo tanto, empieza siempre por escribir algo que sea correcto y fácil de entender. Si te preocupa que sea demasiado lento, que normalmente no lo es, ya que la mayoría del código simplemente no se ejecuta con la frecuencia suficiente para llevar una cantidad significativa de tiempo, puedes medirlo después y mejorarlo si es necesario.</blockquote><p>En este punto te preguntarás, porque alguien elegiría escribir una función recursiva en vez de un bucle. Si los bucles son mucho más sencillos, ¿verdad?</p><p>Bueno, eso es cierto - pero hay algunos problemas que son más fáciles de resolver con recursión. Si deseas explorar uno de esos problemas, considera leer el capítulo 3 de Eloquent JavaScript.</p><p>Ahora que has descubierto un nuevo superpoder, pongámoslo en práctica.</p><p>Realiza los siguientes ejercicios utilizando recursión. Si crees que puedes asumir más, puedes resolver los famosos problemas factorial y secuencia de Fibonacci.</p><h2 id="ejercicios"><strong>Ejercicios</strong></h2><p>Si te gustaría ponerte un reto, considera resolver los siguientes ejercicios.</p><ol><li>Escribe un programa que invierta una cadena usando recursión. Dada la cadena "freeCodeCamp", el programa debería devolver "pmaCedoCeerf".</li><li>Escribe un programa que devuelva el número de veces que aparece una letra en una cadena. Tu programa debería recibir una cadena y la letra. <br><code>let programa = (cadena, letra) =&gt; {...}</code><br>Después, debe devolver el número de veces que la letra aparece en la cadena. Dado el texto "JavaScript" y la letra &nbsp;"a", su programa debe devolver 2.‌‌‌‌ <br><strong>Pista</strong>: Intenta averiguar cuándo quieres que la función deje de llamarse a sí misma y cómo devolver una versión más pequeña del problema cada vez que la función se llama a sí misma.</li></ol><p>Eso es todo por ahora. Espero te haya servido para entender recursión un poco más.‌‌</p><p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/codingknite/">Joel P Mugalu</a> - <a href="https://www.freecodecamp.org/news/understanding-recursion-in-javascript/">How to Understand Recursion in JavaScript</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ El comando git push explicado ]]>
                </title>
                <description>
                    <![CDATA[ El comando git push te permite subir los commits desde tu rama (branch) local en tu repositorio git local al repositorio remoto. Para poder subir a tu repositorio remoto, te debes asegurar de hacer commit  a todos tus cambios al repositorio local. La sintaxis de ese comando es la siguiente: ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/el-comando-git-push-explicado/</link>
                <guid isPermaLink="false">5ff3a3db8c7cd154bb9849ee</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Christian Perez ]]>
                </dc:creator>
                <pubDate>Mon, 22 Feb 2021 05:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/02/photo-1525565004407-a1f6f55b5dd6-1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>El comando <code>git push</code> te permite subir los commits desde tu rama (branch) local en tu repositorio git local al repositorio remoto.</p><p>Para poder subir a tu repositorio remoto, te debes asegurar de <strong>hacer commit &nbsp;a todos tus cambios al repositorio local.</strong></p><p>La sintaxis de ese comando es la siguiente:</p><pre><code class="language-bash">git push &lt;nombre del repositorio&gt; &lt;nombre de la rama&gt;</code></pre><p>Existen diferentes opciones que puedes pasar a este comando, puedes aprender más acerca de estos en la<a href="https://git-scm.com/docs/git-push#_options_a_id_options_a" rel="nofollow"> documentación</a> de Git o ejecuta <code>git push --help</code>.</p><h3 id="subir-a-un-repositorio-remoto-y-rama-espec-fica-"><strong>Subir a un repositorio remoto y rama específica.</strong></h3><p>En orden para subir tu código, primero debes clonar un repositorio a tu máquina local.</p><pre><code class="language-bash"># Una vez clonado el repositorio, estarás trabajando dentro de la rama por defecto (Por defecto es `main`)
git clone https://github.com/&lt;git-usuario&gt;/&lt;nombre-repo&gt; &amp;&amp; cd &lt;nombre-repo&gt;
# Haz cambios y agrega tus archivos (repite el comando `git add` por cada archivo, o utiliza `git add .` para agregarlos todos)
git add &lt;nombre-archivo&gt;
# Ahora haz el commit de tu código
git commit -m "Agregué cambios a mi repo!"
# Sube los cambios en la rama 'main' a github
git push origin main</code></pre><p>Para aprender más acerca de ramas:</p><ul><li><a href="https://www.freecodecamp.org/espanol/news/git-checkout-explicado/">Git checkout</a></li><li><a href="https://www.freecodecamp.org/espanol/news/explicacion-de-la-rama-de-gi-como-eliminar/">Git branch</a></li></ul><h3 id="subir-a-un-repositorio-remoto-espec-fico-y-todas-las-ramas-que-contiene-"><strong>Subir a un repositorio remoto específico y todas las ramas que contiene.</strong></h3><p>Si quieres subir todos tus cambios al repositorio remoto con todo y sus ramas, puedes utilizar:</p><pre><code class="language-bash">git push --all &lt;NOMBRE-REMOTO&gt;</code></pre><p>el cual:</p><ul><li><code>--all</code> es la bandera que señala que quieres subir todas las ramas al repositorio remoto.</li><li><code>NOMBRE-REMOTO</code> es el nombre del repositorio remoto al cual las quieres subir.</li></ul><p><strong>Subir a una rama específica con el parámetro </strong><em>force</em></p><p>Si quieres ignorar los cambios locales hechos al repositorio Git en Github(Lo cual hacen la mayoría de desarrolladores para dar una solución rápida al servidor de desarrollo) luego puedes usar el comando —force para subir ignorando esos cambios.</p><pre><code class="language-bash">git push --force &lt;NOMBRE-REMOTO&gt; &lt;RAMA-REMOTA&gt;</code></pre><p>En la cual:</p><ul><li><code>NOMBRE-REMOTO</code> es el nombre del repositorio remoto al cual quieres subir los cambios.</li><li><code>RAMA-REMOTA</code> es el nombre de la rama remota a la cual quieres subir los cambios.</li></ul><h3 id="subir-ignorando-el-hook-pre-push-de-git"><strong>Subir ignorando el hook pre-push de Git</strong></h3><p>Por defecto <code>git push</code> disparará el interruptor <code>--verify</code>. Esto significa que git ejecutará cualquier script pre-push(antes de subirlo) del lado del cliente, que haya sido configurado. Si el script pre-push falla, también fallará el git push. ( Hooks Pre-Push son buenos para hacer cosas como, revisar si los mensajes al hacer commit están dentro del estándar de la empresa, ejecutar tests unitarios, etc...). Ocasionalmente podrías querer ignorar este comportamiento por defecto, por ejemplo: en el escenario donde quisieras subir tus cambios a una rama en particular para que otro colaborador la descargue, pero los cambios en tu trabajo en progreso rompen los tests unitarios. Para ignorar el hook, simplemente inserta tu comando push y añade la bandera &nbsp;<code>--no-verify</code></p><pre><code class="language-bash">git push --no-verify</code></pre><p>Traducido del artículo - <a href="https://www.freecodecamp.org/news/the-git-push-command-explained/">The Git Push Command explained</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Evento Onclick de JavaScript explicado. ]]>
                </title>
                <description>
                    <![CDATA[ El evento onclick en JavaScript te permite como programador, ejecutar una función cuando se le da clic a un elemento. Ejemplo de botón onclick <button onclick="miFunc()">Haz click</button> <script>   function miFunc() {     alert('Se ha dado clic al botón!');   } </script> En el ejemplo ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/untitled-10/</link>
                <guid isPermaLink="false">5ff2165f8c7cd154bb9838ec</guid>
                
                <dc:creator>
                    <![CDATA[ Christian Perez ]]>
                </dc:creator>
                <pubDate>Mon, 15 Feb 2021 04:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/02/photo-1566923121432-10c888f55bd0-1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>El evento <code>onclick</code> en JavaScript te permite como programador, ejecutar una función cuando se le da clic a un elemento.</p><h2 id="ejemplo-de-bot-n-onclick">Ejemplo de botón onclick</h2><pre><code class="language-javascript">&lt;button onclick="miFunc()"&gt;Haz click&lt;/button&gt;

&lt;script&gt;
  function miFunc() {
    alert('Se ha dado clic al botón!');
  }
&lt;/script&gt;</code></pre><p>En el ejemplo de arriba, cuando un usuario haga clic en el botón, verá una alerta en el navegador que muestra <code>Se ha dado clic al botón!</code></p><h2 id="agregando-onclick-din-micamente"><strong>Agregando <strong>onclick d</strong>inámicamente</strong></h2><p>El evento <code>onclick</code> se puede añadir también mediante código a cualquier elemento utilizando el siguiente ejemplo:</p><pre><code class="language-javascript">&lt;p id="foo"&gt;Haz clic en este elemento.&lt;/p&gt;

&lt;script&gt;
  let p = document.getElementById("foo"); // Encuentra el elemento "p" en el sitio
  p.onclick = muestraAlerta; // Agrega función onclick al elemento
    
  function muestraAlerta(evento) {
    alert("Evento onclick ejecutado!");
  }
&lt;/script&gt;</code></pre><h3 id="nota"><strong><strong><strong><strong>Not</strong></strong></strong>a</strong></h3><p>Es importante notar que utilizando <em>onclick</em> solamente podemos agregar una función de escucha (listener function) que espera que algo suceda para capturarlo. Si quisieras agregar más, puedes utilizar addEventListener(), la cual es preferida para agregar capturadores de eventos.</p><p>En el ejemplo de arriba, cuando un usuario da clic en el elemento <code>p</code> dentro del <code>html</code>, verán una alerta que muestra <code>Evento onclick ejecutado!</code>.</p><h2 id="prevenir-la-acci-n-por-defecto">Prevenir la acción por defecto</h2><p>Ahora, si añadimos <code>onclick</code> a enlaces (etiqueta <code>a</code> de HTML) podríamos querer evitar que suceda la acción por defecto(default):</p><pre><code class="language-javascript">&lt;a href="https://guide.freecodecamp.org" onclick="miAlerta()"&gt;Guías&lt;/a&gt;

&lt;script&gt;
  function miAlerta(evento) {
    event.preventDefault();
    alert("Se ah dado clic al enlace pero el sitio no ah sido abierto");
  }
&lt;/script&gt;</code></pre><p>En el ejemplo anterior hemos prevenido el comportamiento por defecto del elemento <code>a</code> (abre el sitio) usando <code>event.preventDefault()</code> dentro de nuestra función<code>onclick</code> &nbsp;callback.</p><p><a href="https://developer.mozilla.org/es/docs/Web/API/GlobalEventHandlers/onclick">MDN</a></p><p>Traducido del artículo - <a href="https://www.freecodecamp.org/news/javascript-onclick-event-explained/">Javascript Onclick Event Explained</a></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
