W3docs

Expresiones de Función en JavaScript

JavaScript ofrece varias formas de definir funciones, entre ellas las Declaraciones de Función y las Expresiones de Función, pilares del desarrollo web moderno.

Introducción a las Expresiones de Función en JavaScript

JavaScript ofrece varias formas de definir funciones, y dos de las más fundamentales son las declaraciones de función y las expresiones de función. Una expresión de función te permite tratar una función como cualquier otro valor: puedes almacenarla en una variable, pasarla a otra función o devolverla desde una. Saber exactamente cómo difieren las expresiones de las declaraciones — especialmente en lo relativo al hoisting — te evitará una clase de errores desconcertantes.

Esta página cubre la sintaxis de las expresiones de función, por qué se comportan de manera distinta a las declaraciones, las expresiones con nombre, los usos más comunes en el mundo real (callbacks, IIFEs, manejadores de eventos, código asíncrono), y cómo todo esto se conecta con las modernas funciones flecha.

Expresiones de Función: Sintaxis y Uso

¿Qué es una Expresión de Función?

Una expresión de función define una función como parte de una expresión más grande — generalmente el lado derecho de una asignación. La función en sí es simplemente un valor, y la variable a la que la asignas se convierte en la forma de invocarla. Esta es la forma más básica:

javascript— editable

Compara esto con una declaración de función, que comienza con la palabra clave function como una instrucción independiente:

javascript— editable

Ambas producen un greet invocable, pero el motor las procesa en momentos distintos — que es exactamente de lo que trata la siguiente sección.

Hoisting: la diferencia clave

Las declaraciones de función son elevadas (hoisted): el motor las lee durante la fase de compilación, por lo que la función existe antes de la línea donde está escrita. Puedes llamarla antes en el archivo. Las expresiones de función no lo son — el valor de la función solo se asigna cuando la ejecución llega a esa línea, por lo que llamarla demasiado pronto falla:

javascript— editable
Información

Nota: Con var, el nombre greet es elevado pero su valor es undefined hasta que se ejecuta la asignación, por lo que llamarla antes lanza un TypeError ("greet is not a function"). Con let o const, el nombre está en la zona muerta temporal y obtienes un ReferenceError en su lugar. De cualquier manera la regla es la misma: define una expresión de función antes de usarla.

Características de las Expresiones de Función

  • Funciones anónimas: Las expresiones de función suelen ser anónimas — la función no tiene nombre propio y se referencia a través de la variable.
  • Almacenadas en variables: La función es un valor, por lo que vive en una variable (o elemento de array, propiedad de object, etc.).
  • Ciudadanos de primera clase: En JavaScript, las funciones son valores de primera clase — pueden pasarse como argumentos, devolverse desde otras funciones y asignarse a variables.
  • Expresiones de función con nombre: Una expresión puede llevar su propio nombre (por ejemplo, let fn = function myFunc() {}). El nombre solo es visible dentro de la función, lo que mejora los stack traces y permite que la función se llame a sí misma.
  • Funciones flecha: El código moderno suele usar funciones flecha (() => {}) como una forma más corta de expresión, aunque manejan this de manera diferente.

Expresiones de Función con Nombre

Dar a una expresión un nombre interno permite que la función se referencie a sí misma de forma fiable — útil para la recursión — incluso si la variable externa se reasigna más adelante:

javascript— editable

Aplicaciones Prácticas de las Expresiones de Función

Funciones de Callback

El uso más común de una expresión de función es como callback — una función pasada a otra función y ejecutada más tarde, tras finalizar alguna operación. Pasar la función en línea como expresión mantiene la lógica justo donde se utiliza:

javascript— editable

IIFE (Expresión de Función Invocada Inmediatamente)

Una IIFE es una expresión de función que se ejecuta en el momento en que se define. Los paréntesis que la envuelven convierten la función en una expresión, y el () al final la llama de inmediato. Esta era la forma clásica de crear un ámbito privado y evitar que las variables se filtraran al ámbito global:

javascript— editable
Información

Nota: Hoy en día, let/const con ámbito de bloque y los módulos ES cubren la mayoría de los usos para los que se empleaban las IIFEs, por lo que las verás menos en código nuevo — pero siguen siendo comunes en bibliotecas más antiguas y scripts empaquetados.

Expresiones de Función vs Declaraciones de Función

Declaración de FunciónExpresión de Función
Sintaxisfunction f() {} como instrucciónlet f = function () {} dentro de una expresión
HoistingCompletamente elevada — invocable antes de su líneaNo invocable antes de que se ejecute la asignación
NombreSiempre tiene nombreGeneralmente anónima (puede tener nombre)
Mejor paraFunciones auxiliares de nivel superior usadas en todo el archivoCallbacks, IIFEs, definiciones condicionales

Una regla práctica: usa una declaración para una función independiente y reutilizable, y una expresión cuando la función sea un valor que estás a punto de pasar a algún lugar o definir condicionalmente.

javascript— editable

Ejemplos Avanzados y Casos de Uso

Manejo de Eventos

En el navegador, las expresiones de función son la forma natural de adjuntar manejadores de eventos, ya que pasas la función directamente a addEventListener:

document.getElementById('myButton').addEventListener('click', function () {
  console.log('Button clicked!');
});

Programación Asíncrona

Con Promises y async/await, las expresiones de función ofrecen una forma concisa de pasar unidades de código. Aquí una expresión de función maneja cada valor resuelto:

javascript— editable

Conclusión

Dominar las Expresiones de Función en JavaScript es clave para escribir código eficiente y mantenible. Su flexibilidad, combinada con el poder de las capacidades de programación funcional de JavaScript, las convierte en una herramienta indispensable en el arsenal de cualquier desarrollador.

Recuerda que la elección entre una Expresión de Función y una Declaración de Función depende de los requisitos específicos de tu código y del contexto en el que estés trabajando. Sigue practicando y explorando estos conceptos para profundizar tu comprensión y dominio de JavaScript.

Práctica

Práctica
¿Cuáles son las características de las expresiones de función en JavaScript?
¿Cuáles son las características de las expresiones de función en JavaScript?
Was this page helpful?