JS: Funciones

Teoría: Objetos de primera clase

En los lenguajes de programación, existe el concepto de "objetos de primera clase (o clase)". Estos se refieren a elementos que pueden ser pasados a funciones, devueltos por funciones y asignados a variables (o constantes). Estos elementos pueden ser cualquier tipo de datos, como números, cadenas, matrices o valores lógicos.

// 5 - número, objeto de primera clase (guardado en una constante)
const num = 5;

// 2 - número, objeto de primera clase (argumento de la función)
// contenido de la constante num - objeto de primera clase (argumento de la función)
// contenido de la constante result - objeto de primera clase (valor devuelto)
const result = Math.pow(num, 2);

Los objetos de primera clase no solo se refieren a lo que normalmente llamamos "datos", sino también a cualquier construcción del lenguaje, como funciones. En JavaScript, las funciones son objetos de primera clase. Esta característica tiene un impacto significativo no solo en cómo se manejan las funciones, sino también en el estilo general de programación. A continuación, hablaremos sobre cómo tratar las funciones como datos.

Guardar en una constante

// ¡Una función se guarda en una constante!
const x = () => console.log('Amo a Códica');

x(); // => 'Amo a Códica'

En este código, hay más acciones de las que normalmente pensamos:

  1. Creación (definición) de la función: () => console.log('Amo a Códica')
  2. Creación de la constante x y guardar en ella el valor de la función: const x =

Es importante comprender este punto. La definición mínima de una función posible se ve así: () => {}. Es una función vacía con un cuerpo vacío que no hace nada. Si se asigna a una constante o no, es una cuestión aparte.

Incluso si se guarda una función dentro de una constante, no hay nada que impida pasarla a otra constante. Sin embargo, no olvides la naturaleza de objeto de la función. Lo que se pasa a otra constante no es la función en sí, sino una referencia a ella:

const a = () => console.log('Amo a Códica');

a(); // => 'Amo a Códica'

const b = a;

b(); // => 'Amo a Códica'

Además, cualquier función se puede usar directamente sin guardarla en una constante:

(() => console.log('Amo a Códica'))(); // => Amo a Códica

En este ejemplo, llamamos a la función "sobre la marcha": primero creamos (() => console.log('Amo a Códica')) y luego la llamamos de inmediato utilizando el operador de llamada de función (). Es importante envolver la definición de la función entre paréntesis para indicar los límites de la definición al intérprete, para que "entienda" qué exactamente quieres llamar. Es comprensible que después de esta expresión, se pierda el acceso a la función porque no se guardó en ningún lugar.

El nombre de la constante es solo su nombre, la función en sí no tiene nombre. Por lo tanto, estas funciones se llaman "anónimas" en programación. En otros lenguajes, las funciones anónimas a menudo se llaman funciones lambda. En JavaScript, a veces también se les llama así.

Creación dentro de otra función

Dado que una función anónima es una expresión, podemos definirla en cualquier parte del programa que permita el uso de expresiones, como en el cuerpo de otra función.

const sum = (a, b) => {
  // definimos una función anónima "interna" y
  // la guardamos en la constante innerSum
  const innerSum = (x, y) => x + y;

  // llamamos a la función interna y
  // devolvemos el resultado de la llamada desde sum
  return innerSum(a, b);
};

sum(1, 4); // 5

A partir del hecho de que la definición de una función es simplemente una expresión, se deduce que se puede pasar como argumento a otras funciones y devolverla desde otras funciones como valores. Hablaremos más sobre esto cuando estudiemos las funciones de orden superior.

El uso de funciones anónimas aumenta significativamente las capacidades expresivas del lenguaje, y pronto te darás cuenta de ello. En JavaScript, las funciones anónimas son el núcleo de cualquier programa. Las funciones que crean funciones, devuelven funciones y aceptan funciones como argumentos son la forma principal de desarrollo en JavaScript.

Completado

0 / 16