Un ejemplo de closures

Te publico esto aquí, porque en el foro no me deja.

La closure es la función que DEVUELVES, no basta que esté definida dentro de la función original. Si no la devuelves, la función interna tiene una utilidad muy limitada. La ventaja de la closure es que encapsula TODO el scope de la función original, sin que sea visible para nadie más que para ella. Un uso es el de los "decoradores" de Python, que te permiten cambiar el comportamiento de una función sin tocar su código. Un ejemplo a continuación:

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

Imagina que esta función está en una librería, y no la puedes modificar, pero quisieras que te devolviera en un console.log(a, b, suma(a,b)). Una closure puede encapsular la función suma() y la funcionalidad adicional en una nueva función:

function create_closure(mi_funcion) {
  return function(a, b) {
    var c = mi_funcion(a, b);
    console.log(a, b, c);
    return c;
  }
}

Ahora podemos sustituir la función original por su versión modificada, y seguirá funcionando allá donde la invoques, sólo que añadirá siempre la salida de consola. Y sin tocar la función original.

suma = create_closure(suma);
suma(1, 3)
-> 1 3 4
-> 4

Un saludo,