Created
August 21, 2011 18:42
-
-
Save joseanpg/1160977 to your computer and use it in GitHub Desktop.
GEJS-4 crearSaludos.js Versión (deliberadamente) incorrecta
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. | |
*/ | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.