Tema: closures
Ver Mensaje Individual
  #5 (permalink)  
Antiguo 08/12/2009, 12:56
Avatar de PacoRuiz
PacoRuiz
 
Fecha de Ingreso: abril-2009
Mensajes: 254
Antigüedad: 15 años
Puntos: 3
closures

Hola,

Sé que he puesto hace poco un tema similar, pero me da la sensación de que lo que no entiendo se debe a algún error de concepto que tengo, y que quizás no quede muy claro en el otro tema.

He leido esto:

Cita:
Closures
Es decir, tomemos un ejemplo como este (un clásico xD):

function crearContador() {
var c = 0;
function f() {
c = c + 1;
return c;
}
return f;
}
var contador1 = crearContador();
alert(contador1()); // 1
alert(contador1()); // 2
alert(contador1()); // 3

crearContador es una función que nos va a devolver otra función. Hasta aquí nada nuevo. Pero observemos qué pasa con la variable c. c está definida con un alcance local dentro de crearContador. Es decir, que una vez que hemos salido de crearContador, y tal como vimos en el primer artículo, c ya no es accesible, no es visible. Está, decimos, fuera del alcance.

Sin embargo, hay dos detalles a tener en cuenta:

Cuando definimos la función f, la variable c sí que está dentro del alcance. Está en su mismo contexto de definición. Luego esa referencia a c dentro de f debería ser válida.
Cuando finalmente ejecutamos la función contenida en contador1 observamos por el resultado que la referencia está efectivamente siendo válida.
¿Qué es lo que ocurre? Lo que ocurre es (redoble de tambor) .....
No entiendo qué tiene de raro que la referencia siga siendo válida. Yo lo veo así:

la instrucción alert(contador1()); ejecuta la función CrearContador(), y ésta.. ah, creo que ahora lo veo, ésta devuelve el código de la función f() pero no la ejecuta dentro de CrearContador() sino fuera, y esto es lo que hace raro que c siga siendo válida ¿no?

O sea que no devuelve el valor del resultado de f() sino el propio código de la función. ¿Eso es?

Última edición por PacoRuiz; 08/12/2009 a las 13:02