Las funciones puras y las funciones impuras son dos términos comunes utilizados en JavaScript. A primera vista, ambas funciones parecen idénticas.
Sin embargo, si miramos más de cerca, hay algunas diferencias importantes entre ellas. Como desarrolladores, es esencial entender las similitudes y diferencias de estas funciones para sacarles el máximo partido.
En este artÃculo, hablaré de las funciones puras e impuras de JavaScript en profundidad y destacaré sus usos, ventajas y diferencias.
Funciones puras
En términos simples, las funciones puras no tienen un estado interno. Por lo tanto, todas las operaciones realizadas en las funciones puras no se ven afectadas por su estado. Como resultado, los mismos parámetros de entrada darán la misma salida determinista independientemente de las veces que se ejecute la función.
Para entenderlo mejor, veamos el siguiente ejemplo.
function add(a,b) {
return a + b
}
console.log(add(4,5))
Este ejemplo contiene una simple función add()
, que da 9 como salida. Es una salida muy predecible, y no depende de ningún código externo. Esto hace que la función add()
sea una función pura.
Si una función se declara pura y no tiene un estado, puede compartir muchas instancias dentro de una clase. Además, se aconseja evitar las mutaciones dentro de las funciones puras.
Ventajas de las funciones puras
Una función pura funciona como una función independiente que da la misma salida para las mismas entradas.
Las funciones puras son legibles debido a su comportamiento independiente. Además, son fáciles de depurar.
Se puede clonar un estado externo en una función pura, pero esto no cambia la pureza de la función.
Funciones impuras
Una función impura es una función que contiene uno o más efectos secundarios. Muta los datos fuera de su ámbito léxico y no produce previsiblemente la misma salida para la misma entrada.
Por ejemplo, considere el siguiente fragmento de código:
var addNew = 0;
function add(a,b){
addNew =1;
return a + b + addNew
}
console.log(add(4,5))
En el ejemplo anterior, hay una variable llamada addNew
, y se declara fuera de la función add()
. Pero el estado de esa variable se cambia dentro de la función add()
. Por lo tanto, la función add()
tiene un efecto secundario en una variable fuera de su ámbito y, por lo tanto, se considera una función impura.
JavaScript no se adhiere a las nociones rigurosas de pureza e inmutabilidad de las funciones. Cualquier programa que desarrolle necesitará funciones impuras para modificar el estado de las variables de JavaScript (llamadas ubicaciones de memoria).
En general, lo ideal es mantener los elementos impuros de sus programas separados del procesamiento de datos, que suele ser puro. Además, la actualización y el mantenimiento de tus aplicaciones será mucho más fácil si confinas los elementos impuros a sus funciones particulares.
Las siguientes funciones de JavaScript son inherentemente impuras:
Math.random()
Math.random() es una función impura ya que modifica el estado interno del objeto Math y proporciona resultados diferentes con cada llamada. Por lo tanto, Math.random()
puede contener efectos secundarios.
Math.random(); (Output: 0.4450692005082965)
Math.random(); (Output: 0.7533405303023756)
Math.random(); (Output: 0.4011148700956255)
En el fragmento de código anterior, no se pasan argumentos a ninguna de las llamadas a la función Math.random()
, pero aun asà todas producen un resultado diferente.
Date.now()
arr.splice()
arr.push()
arr.sort()
console.log()
yalert()
también son funciones impuras (aunque generan el mismo comportamiento y siempre devuelven el mismo valor para llamadas idénticas).
JavaScript es sincrónico por naturaleza. Por lo tanto, las funciones asÃncronas como fetch y promise son impuras.
Ventajas de las funciones impuras
- Las funciones impuras pueden utilizar una solución in situ para reducir la complejidad del espacio.
- En las funciones impuras, el estado puede modificarse para utilizar la variable padre y llamar a la compilación de la función.
Como se ha mencionado, la principal diferencia entre las funciones puras e impuras en JavaScript son los efectos secundarios. Por lo tanto, vamos a discutir algunos detalles sobre los efectos secundarios.
Efectos secundarios
Los efectos secundarios pueden ocurrir en su programa cuando utiliza un bloque de código externo dentro de una función. Como resultado, puede haber problemas de rendimiento en su aplicación.
Consideremos el siguiente ejemplo y discutamos los efectos secundarios en detalle.
var preNumber =2;
function addValue(newNumber){
return preNumber += newNumber;
}
En el ejemplo anterior, la variable preNumber se utiliza dentro de la función addValue()
. Este comportamiento puede dar lugar a los siguientes efectos secundarios.
Efecto secundario 1: Problema de dependencia
El método addValue()
depende de la variable preNumber. Si preNumber no está definida o no está disponible, el método lanzará un error.
Efectos secundarios 2: Modificación del código externo
Cuando la función addValue()
se ejecuta, cambia el estado de la variable preNumber. Esto demuestra que el método addValue()
tiene un efecto secundario de modificación de código externo.
Efectos secundarios 3: Función no determinista
La función addValue()
utiliza código externo. Esto hace que la función no sea determinista, lo que significa que no se puede determinar la salida mirando.
Funciones puras frente a funciones impuras
Vamos a comparar y contrastar las diferencias entre las funciones puras y las impuras:
- Las funciones puras no tienen efectos secundarios. Las funciones impuras pueden provocar efectos secundarios.
- Las funciones puras devuelven el mismo resultado si utilizamos los mismos parámetros de entrada. Sin embargo, las funciones impuras dan resultados diferentes cuando pasamos los mismos argumentos varias veces.
- Las funciones puras siempre devuelven algún resultado. Las funciones impuras pueden ejecutarse sin producir nada.
- Depurar funciones puras es relativamente más fácil que depurar funciones impuras.
- Las funciones puras no pueden ejecutar llamadas AJAX o manipulación estándar del DOM.
- Las funciones impuras no son inherentemente malas. Simplemente pueden causar cierta confusión en sistemas más extensos en forma de código espagueti.
Conclusión
En general, usar funciones puras evitará problemas innecesarios en tu código. Sin embargo, no siempre podemos ceñirnos a las funciones puras. Hay situaciones en las que necesitamos usar funciones impuras. Debemos tener en cuenta los efectos secundarios y minimizar los problemas innecesarios en tales situaciones.