Skip to content

Instantly share code, notes, and snippets.

@joseanpg
Created August 21, 2011 18:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save joseanpg/1160977 to your computer and use it in GitHub Desktop.
Save joseanpg/1160977 to your computer and use it in GitHub Desktop.
GEJS-4 crearSaludos.js Versión (deliberadamente) incorrecta
function crearSaludo(array) {
var resultado = [];
for (var j=0, len = array.length; j<len; j++) {
var nombre = array[j];
resultado.push(function(){
console.log("Hola " + nombre);
});
}
return resultado;
}
var saludos = crearSaludo(['Yolanda','Maria','Juan']);
saludos[0]();saludos[1]();saludos[2]();
//Obtendremos:
//Hola Juan
//Hola Juan
//Hola Juan
/*
¡SORPRESA! ¡El único que resulta saludado es Juan!¡Y tres veces nada menos!
Observemos que el Juan se corresponde precisamente con el último valor asignado
a la variable `nombre` del interior del bucle. Eso nos da la pista.
Lo que está ocurriendo es que todas las funciones que se van creando tienen tienen el
siguiente aspecto
function(){
console.log("Hola " + nombre);
}
Estas funciones no tienen parametros formales pero si es visible en ellas una *variable libre*.
Cuando se ejecuten necesitaran el valor de la variable libre `nombre`.
El valor de dicha variable se encuentra en el *environment* en el que se crean las funciones.
Sin entrar en muchos detalles pensar en que dicha entidad es el *stack frame* (no es exactamente
esto pero nos vale para esta explicación) que se ha creado al llamar a `crearSaludos`.
En dicho *environment* encontramos una variable llamada `nombre`que va tomando distintos valores.
Todas las funciones que se van creando y metiéndose en el array comparten ese mismo *environment*,
y en consecuencia comparten la misma variable `nombre`.
Cuando el bucle termina `nombre` vale "Juan", ese es valor que todas las funciones verán cuando se
ejecuten.
*/
@felixzapata
Copy link

Podría servir algo así:

var txt = nombres[i];
auxiliar.push(function(txt){
return function(txt2){
return "Hola " + txt;
}
}(txt))

aunque la verdad que estos ejemplos siempre los he visto y los he usado alguna vez pero me llegan a liar un poco. Quiero decir, entiendo el por qué pasa; pero me cuesta ver la solución.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment