JavaScript/Funciones anónimas

Anterior: Funciones Índice Siguiente: Programación basada en objetos

Una función anónima es una función que fue declarada sin ningún identificador con nombre para referirse a ella. Como tal, una función anónima no suele ser accesible después de su creación inicial.

Definición de función normal:

function hello() { alert('Hello world');}hello();

Definición de función anónima:

var anon = function() { alert('I am anonymous');}anon();

Un uso común de las funciones anónimas es como argumentos de otras funciones. Otro uso común es como cierre, para lo cual ver también el capítulo de Cierres.

Uso como argumento de otras funciones:

setTimeout(function() { alert('hello');}, 1000);

Arriba, la función anónima se pasa a setTimeout, que ejecutará la función en 1000 milisegundos.

Uso como cierre:

(function() { alert('foo');}());

Desglose de las sentencias anónimas anteriores:

  • Los paréntesis circundantes son una envoltura para la función anónima
  • Los paréntesis finales inician una llamada a la función y pueden contener argumentos

Otra forma de escribir el ejemplo anterior y obtener el mismo resultado:

(function(message) { alert(message);}('foo'));

Una representación alternativa de lo anterior coloca los paréntesis iniciadores a los paréntesis circundantes y no a la función en sí, lo que causa confusión sobre por qué se necesitan los paréntesis circundantes en primer lugar.

(function() { // …})();

Algunos han recurrido incluso a dar a la técnica de las llaves finales nombres despectivos, en un esfuerzo por animar a la gente a moverlas de nuevo dentro de las llaves circundantes a donde inician la función, en lugar de las llaves circundantes.

Una función anónima puede referirse a sí misma a través de la variable local arguments.callee, útil para funciones anónimas recursivas:

// returns the factorial of 10.alert((function(n) { return !(n > 1) ? 1 : arguments.callee(n - 1) * n;})(10));

Sin embargo, arguments.callee está obsoleto en ECMAScript 5 Strict. Los problemas con arguments.callee son que hace imposible lograr la recursividad de cola (un plan futuro para JavaScript), y resulta en un valor diferente de este. En lugar de usar arguments.callee, puedes usar una expresión de función con nombre:

// returns the factorial of 10.alert( (function factorial(n) { return (n <= 1) ? 1 : factorial(n - 1) * n;})(10) );

Una expresión de función de flecha es similar a lo que en otros lenguajes de programación se conoce como lambda, introducida en ECMAScript 6 en 2015. Proporciona una forma abreviada de crear funciones anónimas.

Ejemplos:

  • x => x + 1
    • Una función anónima con un argumento x que devuelve x + 1.
  • x => {retorno x + 1}
    • Como la anterior, pero con un cuerpo de función.
  • (x, y) => x + y
    • Una función flecha de 2 cargas.
  • (x, y) => {retorno x + y}

Enlaces:

  • Funciones # La expresión de la función_flecha, desarrollador.mozilla.org
  • Funciones/funciones de flecha, developer.mozilla.org