2010-01-15 15 views
16

¿Qué son cierres y devoluciones de llamada en JavaScript? Todavía tengo que encontrar una buena explicación de cualquiera.¿Qué son cierres y devoluciones de llamada?

+0

http://stackoverflow.com/questions/1095707/what-is-the-exact-definition-of-a-closure –

+6

¿Has probado esto en google: "closing javascript site: stackoverflow.com" (Don ' molestar con el cuadro de búsqueda en SO en sí es una basura) Hay un montón de lugares donde se describen los cierres – AnthonyWJones

+0

http://stackoverflow.com/questions/111102/how-does-a-javascript-closure-work – Upperstage

Respuesta

34

cierres ya han sido bien manejados en Stackoverflow aquí es sólo una selección: -

How does a javascript closure work?
What exactly does “closure” refer to in JavaScript?
can you say this is a right example of Javascript Closure.. Where the places we need to consider avoiding the closures??
JavaScript scope and closure
Javascript Closures and ‘this’ context
JavaScript - How do I learn about “closures” usage?

Las devoluciones de llamada son un concepto más simple. Una devolución de llamada es básicamente cuando una función acepta otra función como parámetro. En algún punto durante la ejecución, la función llamada ejecutará la función pasada como parámetro, esta es una devolución de llamada . Con bastante frecuencia, la devolución de llamada ocurre realmente como un evento asincrónico, en cuyo caso la función llamada puede regresar sin haber ejecutado la devolución de llamada, lo que puede ocurrir más tarde. Aquí es un ejemplo común (basado en navegador): -

function fn() { alert("Hello, World"); } 
window.setTimeout(fn, 5000); 

Aquí la función fn se pasa como una devolución de llamada a la función setTimeout. El tiempo de espera establecido regresa inmediatamente; sin embargo, 5 segundos después, se ejecuta la función pasada como una devolución de llamada .

Los cierres y las devoluciones de llamada

Muy a menudo la razón por la que los cierres se crean (ya sea de paso, accidental o deliberadamente) es la necesidad de crear una devolución de llamada. Por ejemplo: -

function AlertThisLater(message, timeout) 
{ 
    function fn() { alert(message); } 
    window.setTimeout(fn, timeout); 
} 

AlertThisLater("Hello, World!", 5000); 

(Por favor, lea algunos de los mensajes vinculados a captar cierres)

Se crea un cierre que contiene en parte el parámetro message, fn se ejecuta bastante tiempo después de la llamada a AlertThisLater tiene devuelto, aún fn todavía tiene acceso al contenido original de message.

+0

¿Las devoluciones de llamada se usan con más frecuencia con setTimeout? –

+1

setTimeout es un uso común pero igualmente común sería 'onreadystatechange' en el objeto' XmlHttpRequest'. También verá un uso extensivo de devoluciones de llamadas en código que usa marcos de JavaScript como JQuery. En muchos de estos casos, la devolución de llamada es justo donde proporcionaría un poco de lógica para personalizar un proceso grande pero por lo demás estándar. También se utilizan con frecuencia devoluciones de llamada para ejecutar la misma función sobre un conjunto de objetos. – AnthonyWJones

Cuestiones relacionadas