2012-10-05 10 views
5

Presupuesto de JavaScript orientado a objetos de Stoyan Stefanov (página 84):¿Es esta una declaración correcta para Closure?

enter image description here

Si estás en el punto a, que estás dentro del espacio global. Si se encuentra en el punto b, que es dentro del espacio de la función F, entonces tiene acceso al espacio global y al el espacio-F. Si se encuentra en el punto c, que está dentro de la función N, puede acceder al espacio global , el espacio F y el espacio N No puede alcanzar de aa b, porque b es invisible fuera de F Pero puede obtener de c a b si lo desea, o de N a b. El interesante cosa: el cierre ocurre cuando alguna manera-N escapa de F y termina en el espacio global. "

creo que la frase en negrita anterior debe ser cambiado a" Si estás en el punto c , que está dentro de la función N, entonces puede acceder al espacio global y al N-espacio "(el espacio-F no debe estar contenido, porque el punto c solo tiene acceso al espacio-N y al ámbito global G.) .

Estoy en lo cierto? gracias.

+0

¿Por qué no tendrías N acceso a F? N está dentro de F. Creo que se supone que el dibujo indica que N se declaró dentro y devuelto de la función F. – jahroy

+0

No necesariamente "devuelto desde" @jahroy. Existen otros mecanismos para crear una referencia externa a una función interna, por ejemplo su asignación directa a un miembro externo o sus archivos adjuntos, como un controlador de eventos, a un elemento DOM. –

Respuesta

1

Como han dicho otros, no.

Casi todo el punto acerca de un cierre es que una referencia externa a una función interna mantiene viva no solo esa función interna sino que también le permite acceder al entorno exterior en el que fue creada, incluso si ese entorno exterior surgiera de una función ejecutada que ha completado y devuelto.

creo que el diagrama sería ilustrar mejor cierre si el azul N se muestra en el interior F y la versión de puntos (la referencia a N) fueron mostrados fuera F.

La última frase de la declaración citada también podrían mejorarse:

La cosa interesante - un cierre - que ocurre cuando existe una referencia externa a N, fuera de F.

Tenga en cuenta que esta versión evita la mención del espacio global. Cualquier alcance externo será suficiente para que se forme un cierre.

La afirmación podría ir más allá al decir que el mecanismo que permite que se formen cierres es la supresión de la recolección de basura.

Advertencia: hay muchas malas definiciones y descripciones de "cierre", tanto en la web como en los libros. La entrada actual de la etiqueta wiki de Stack Overflows para "cierres" es un buen ejemplo.

+0

Claro, hay demasiadas malas descripciones de "cierre", pero su descripción ("un cierre ... que fue creado") es la mejor que he leído. Además, creo que el cierre debe entenderse desde la perspectiva de la "cadena de alcance", en lugar de la comparación de implementación con otros lenguajes (por ejemplo, las variables de pila de estilo C). ¿Estás de acuerdo? –

+0

@MattElson, gracias por su amable comentario. Mi sentimiento más fuerte sobre este tema es que cualquier definición que comience con "Un cierre es una función ..." está condenada porque tales definiciones no son fieles al concepto original de Landin de un cierre "que tiene una parte de entorno y una parte de control". No hay lugar para ello aquí, pero hay otra razón de peso para alejarse del omnipresente tipo de definición "... es una función ...". Algún día conseguiré todo lo escrito en un papel y lo presentaré en una conferencia. –

2

No, creo que lo que está diciendo es que N es una función que ha sido devuelto fr om función F, y por lo tanto tiene acceso (a través de un cierre) a la variable b que se declaró dentro de F. Por ejemplo (live example):

function F() { 
    var b = 10; 
    return function() { 
     console.log(b); 
    };  
} 

var N = F(); //N is a reference to the anonymous function returned from F 

N(); //logs '10' because we still have access to b (because of the closure) 
+0

Así es exactamente como lo leí: se supone que el círculo azul (dibujado fuera del círculo rojo, pero apuntando hacia atrás) representa una función que fue "devuelta" de F. – jahroy

1

No, no tiene razón.

Se supone que el círculo de puntos representa el alcance real de N, que se encuentra dentro de F.

1

No, en el punto c realmente tiene acceso al espacio F.

Un ejemplo de esto:

function F() { 

    var b = 42; 

    function N() { 
    alert(b); 
    } 

    return N; 

} 

// get a reference to the function N in the global scope: 
var n = F(); 
n(); // shows 42 
1

No, no está bien, mira el código de abajo.

// the global space 
var g = 'g'; 

function F() { 
    // the F space 
    var a = 'a'; 
    function N() { 
    // the N space 
    // here you could access g in the global space and a in the F space. 
    var c = 'c'; 
    console.log(g, a); 
    } 
} 
Cuestiones relacionadas