Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Funciones

Contenidos
  1. Function declaration (funciones nombradas)
  2. Function expression (expresión de funciones)
  3. Callbacks
  4. IIFE
  5. Closures

La diferencia entre una función de expresión (function expression) y una función de declaración (function declaration) en JavaScript es cómo se definen y cómo se comportan en el código.

Function declaration (funciones nombradas)

Son las funciones más comunes en JavaScript. Se definen utilizando la palabra clave function seguida del nombre de la función y paréntesis de parámetros. Por ejemplo:

console.log(add(3,4))

function add(a, b) {
  return a + b;
}

Function expression (expresión de funciones)

Por otro lado, una función de expresión se define asignando una función a una variable. Estas funciones son cargadas durante la ejecución del código y sólo pueden ser llamadas después de haber sido definidas. Por ejemplo:

const add = function(a, b) {
  return a + b;
};

console.log(add(3,4))

Callbacks

En JavaScript un callback es una función que se pasa como argumento a otra función y se ejecuta en algún momento después. Los callbacks son muy comunes en JavaScript ya que muchas de las funciones en la biblioteca estándar de JavaScript, como setTimeout, setInterval, addEventListener, etc, aceptan callbacks como argumentos.

Aquí tienes un ejemplo de un callback en acción:

function greeting(name) {
  console.log("Hello, " + name);
}

function processUserInput(callback) {
  var name = "Juanito";
  callback(name);
}

processUserInput(greeting);

IIFE

Una IIFE (Immediately Invoked Function Expression) en ES5 es una función anónima que se ejecuta inmediatamente después de su definición. Se escriben dentro de paréntesis y se llaman a sí mismas con () al final de su definición, como este ejemplo:

(
  function (param) {
  console.log(param) 
  }
)('someParam');

Una aplicación de estas funciones es cuando se requiere hacer algún computo sin crear variables globales extra. Una desventaja es que no podemos realizar el computo más de una vez si fuese necesario. Esto las hace buenos candidatos para tareas únicas de iniciación.

Closures

En JavaScript todas las funciones son closures. Esto es porque todas las funciones mantienen una referencial al entorno en el que fueron creadas. Junto con esto, Javascript permite crear funciones dentro de funciones y retornarlas. De esta forma, la función retornada tendrá acceso y podrá modificar variables declaradas en su entorno.

Podemos decir que se crea un closure cuando una función mantiene conexión (mediante variables) con su entorno superior aún cuando su entorno superior ha retornado.

En este ejemplo, la función asociada al event listener tiene acceso a la variable interna counter y la modifica aún cuando su función padre ya se ejecutó. Esta es una de las principales ventajas que vió Ryan Dahl para crear NodeJS con JavaScript. Así, las funciones que deben esperar eventos que ocurren en red (Node JS fue pensado para Networking Applications) pueden acceder a sus propias variables internas y facilitar el manejo de muchos eventos concurrentes. Volveremos a profundizar en estos conceptos cuando practiquemos en el Servidor. Por mientras podemos concluir que en Javascript todas las funciones pueden crear closures con sus entornos superiores.