Una función anónima es simplemente una función que no tiene nombre; nada mas. Un cierre es una función que captura el estado del entorno circundante.
Una función anónima no necesariamente necesita crear un cierre, y un cierre no se crea solo para funciones anónimas.
Considere este contraejemplo hipotético. Considere un idioma Foo que no admite cierres pero admite funciones anónimas. Este lenguaje puede no compilar o arrojar un error para el siguiente código porque "saludo" no está definido en el alcance de la función interna. El hecho de que sea anónimo es irrelevante.
function outer() {
var greeting = "hello ";
(function(name) {
alert(greeting + name);
})("John Doe");
}
Consideremos un lenguaje real ahora que sí admite cierres - JavaScript. Tomando el mismo ejemplo que el anterior, pero nombrando la función interna esta vez da:
function outer() {
var greeting = "hello ";
(function inner(name) {
alert(greeting + name);
})("John Doe");
}
Aunque la función interior no es anónimo más, que todavía captura estado del medio ambiente circundante.
Los cierres proporcionan mucha conveniencia, ya que de lo contrario estaríamos pasando cada dependencia de la función como argumento.
function outer() {
var greeting = "hello ";
(function(name, greeting) {
alert(greeting + name);
})("John Doe", greeting);
}
Nop, pero es un duplicado de mi mala http://stackoverflow.com/questions/220658/what-is-the-difference-between-a-closure-and-a-lambda –