2011-02-06 23 views
49

posibles duplicados (diferencia?):
What is Closures/Lambda in PHP or Javascript in layman terms?
What is the difference between a 'closure' and a 'lambda'?Cierre vs función anónima

Hola,

he sido incapaz de encontrar una definición que explica claramente la diferencias entre un cierre y una función anónima.

La mayoría de las referencias que he visto especifican claramente que son "cosas" distintas, pero parece que no entiendo por qué.

¿Podría alguien simplificarlo por mí? ¿Cuáles son las diferencias específicas entre estas dos características del lenguaje? ¿Cuál es más apropiado en qué escenarios?

+2

Nop, pero es un duplicado de mi mala http://stackoverflow.com/questions/220658/what-is-the-difference-between-a-closure-and-a-lambda –

Respuesta

74

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); 
} 
+0

¿Puede citar algunas fuentes para las definiciones utilizadas en tu respuesta? – Pacerier

+0

@Pacerier No he utilizado ninguna otra definición que no sea la ya mencionada en la pregunta, y eso es básicamente 'closures' y' anonymous functions'. Se me ocurrieron los ejemplos por mi cuenta, por lo que no puedo proporcionar referencias externas para ellos. – Anurag

+0

Lo que quiero decir es referencia desde una fuente más definida como Wikipedia, etc. – Pacerier

Cuestiones relacionadas