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

Hola, estoy leyendo sobre closures, y he dado con un blog donde una amable muchacha parece saber explicar las cosas, y me estaba enterando bien del tema pero hay algo que no entiendo, dice esta chica:


Cita:
Pero hay otra característica especial que tienen los closures (que los diferencian de cualquier otra función o bloque de código). Como ya sabemos, cuando una función finaliza su ejecución, todas las variables locales (dentro de su scope) se liberan. Sin embargo, miren esto:

function unaFuncionCualquiera() {

var variableExterna = "soy una linda variable local de unaFuncionCualquiera()";

var unLindoClosure = function() {

alert("Hola soy un lindo closure y puedo acceder a variables fuera de mi scope, miren: " + variableExterna);

}

return unLindoClosure;

}

var test = unaFuncionCualquiera();

test();

La variable test guarda el valor de retorno de la llamada a unaFuncionCualquiera(), es decir un puntero al closure unLindoClosure. Cuando se llama a test() se llama al closure. Sin embargo, para este entonces la función unaFuncionCualquiera() ya terminó su ejecución, y todas sus variables locales (como variableExterna) deberían haber sido liberadas (como pasa con todas las variables locales a una función después de que esta finaliza). Sin embargo, si prueban el código, verán que esto no pasó, y el closure ejecuta un alert mostrando el contenido de la variable variableExterna que se supone que debería haber sido liberada al terminar la ejecución de unaFuncionCualquiera().
Lo que no entiendo es cuando dice que para este entonces la función unaFuncionCualquiera() ya terminó su ejecución. Se supone que unLindoClosure está dentro de unaFuncionCualquiera(), por lo tanto unaFuncionCualquiera() no puede terminar su ejecución mientras no termine todo su código, incluído unLindoClosure. O sea que según yo lo veo unLindoClosure no podría jamás ejecutarse habiéndose terminado la ejecución de unaFuncionCualquiera().