HOWTO · JavaScript

Funciones anidadas en JavaScript

Este tutorial demuestra funciones anidadas en JavaScript.

En esta página

Una función anidada es una función definida dentro de otra. La función externa determina dónde está disponible la función interna, y esta puede leer variables del ámbito en el que se creó. Esta guía muestra cómo definir y llamar una función anidada, por qué puede resultar útil su acceso a variables externas y cómo mantener este patrón legible.

¿Qué son las funciones anidadas?

En JavaScript, una función interna puede usar parámetros y variables locales de su función externa. Si la función interna sigue siendo accesible después de que la externa retorna, conserva el acceso a las variables que referencia. La combinación de una función y ese acceso léxico preservado se denomina cierre léxico.

Ejecuta este ejemplo:

function makeAdder(amount) {
  return function add(value) {
    return amount + value;
  };
}

const addFive = makeAdder(5);
console.log(addFive(10));
15

El resultado de ejecución proporcionado es 15. makeAdder(5) devuelve la función interna, que después se llama con 10; esa función lee amount del ámbito léxico de la llamada externa. Devolver una función interna es un patrón habitual de cierre léxico. Esto no es currificación automáticamente: la currificación transforma específicamente una función que acepta varios argumentos en una secuencia de funciones que aceptan un argumento cada una.

Ventajas de usar funciones anidadas

Anidar una función mantiene una función auxiliar cerca del código que la utiliza y evita añadir un nombre al ámbito circundante. Una función interna devuelta también puede conservar estado privado entre llamadas. Por ejemplo, una fábrica de contadores puede crear un count local y devolver una función que lo actualiza. Cada llamada a la fábrica crea su propia vinculación, por lo que varios contadores pueden mantener estados independientes. Los cierres léxicos permiten este comportamiento, pero no garantizan una ejecución más rápida.

Una función interna puede acceder a variables externas, pero eso no convierte cualquier callback en una función anidada. Un callback definido en otro lugar y pasado a una función es un callback de una función de orden superior; solo está anidado si se define dentro de otra función.

Cuándo usar funciones anidadas

Usa una función anidada cuando necesite valores o acceso al ámbito de su función externa, cuando una función auxiliar solo tenga sentido allí o cuando quieras crear una función configurada con un valor, como un multiplicador. Devolver esa función configurada permite reutilizar el ajuste sin tener que pasarlo en cada llamada.

Si la función auxiliar no necesita las variables ni el ámbito de la función externa, definirla en un ámbito más amplio puede facilitar su reutilización y prueba. Elige la anidación cuando aclare una relación o permita conservar estado, no solo porque sea posible colocar una función dentro de otra.

Buenas prácticas para las funciones anidadas

Mantén cada función enfocada y elige nombres que expliquen la relación entre la configuración externa y la acción interna. Evita niveles de anidación que dificulten seguir el flujo de control; extrae una función auxiliar cuando pueda funcionar por sí sola o cuando cueste revisar la función que la contiene.

Un cierre léxico conserva el acceso a su entorno léxico mientras siga siendo accesible. Es un comportamiento normal y no una razón para evitar los cierres léxicos en general. En código de larga duración, evita mantener accesible una función más tiempo del necesario si eso también mantiene accesibles objetos grandes.

Conclusión

Una función anidada se define dentro de otra función y puede usar las variables externas mediante el ámbito léxico. Cuando se devuelve, puede conservar ese acceso como un cierre léxico, lo que permite mantener estado privado y reutilizar una configuración. Usa este patrón cuando esa relación haga más claro el código y reduce la anidación cuando dificulte entenderlo.

Preguntas frecuentes

  1. ¿Qué son las funciones anidadas en JavaScript? Son funciones definidas dentro de otra función y pueden acceder a las variables de su ámbito léxico externo.
  2. ¿Por qué usar funciones anidadas? Permiten mantener funciones auxiliares locales, conservar estado mediante un cierre léxico o crear funciones configuradas con un valor externo. No mejoran el rendimiento por sí solas.
  3. ¿Pueden las funciones anidadas acceder a las variables de la función externa? Sí. Una función interna puede leer variables de su ámbito léxico, incluso después de que la externa haya retornado, siempre que la función interna siga siendo accesible.
  4. ¿Qué inconveniente tienen las funciones anidadas? Una anidación excesiva puede dificultar la lectura y el mantenimiento del código.
  5. ¿Cómo puedo usar bien las funciones anidadas? Manténlas enfocadas, asígnales nombres claros y define las funciones auxiliares en un ámbito más amplio cuando no necesiten el ámbito que las contiene.