Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Problema con closure

Estas en el tema de Problema con closure en el foro de Javascript en Foros del Web. Hola, tengo un problema, y es que estoy intentan hacer algo como esto: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código Javascript : Ver original var funcs = [ ] ...
  #1 (permalink)  
Antiguo 26/07/2014, 20:57
Avatar de ClubIce  
Fecha de Ingreso: diciembre-2008
Mensajes: 216
Antigüedad: 15 años, 4 meses
Puntos: 2
Problema con closure

Hola, tengo un problema, y es que estoy intentan hacer algo como esto:

Código Javascript:
Ver original
  1. var funcs = [];
  2. for (var i = 0; i<3: i++) {
  3.   funcs.push(function () {
  4.     var index = i;
  5.     console.log(index);
  6.   });
  7. }
  8.  
  9. for (var i in funcs) {
  10.   funcs[i]()
  11. }
  12.  
  13. // El anterior codigo imprime: 3 3 3 3, mientras que yo quiero que imprima 0 1 2 3

Realmente no se como hacer que hago lo que quiero.
  #2 (permalink)  
Antiguo 26/07/2014, 21:31
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Problema con closure

Efectivamente, necesitas hacer un closure, para lo cual son útiles las funciones anónimas:

Código Javascript:
Ver original
  1. var funcs = [];
  2. for (var i = 0; i < 3; i++) {
  3.     (function(j){
  4.         funcs.push(function () {
  5.             var index = j;
  6.             console.log(index);
  7.         });
  8.     })(i);
  9. }
  10.  
  11. for (var i in funcs) {
  12.     funcs[i]();
  13. }

Lo anterior imprimirá: 0, 1, 2. No imprime el 3 porque el bucle va desde el 0 hasta antes del 3.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #3 (permalink)  
Antiguo 26/07/2014, 22:02
Avatar de ClubIce  
Fecha de Ingreso: diciembre-2008
Mensajes: 216
Antigüedad: 15 años, 4 meses
Puntos: 2
Respuesta: Problema con closure

gracias, me ha servido de mucho ;)
  #4 (permalink)  
Antiguo 27/07/2014, 06:58
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Problema con closure

una mejor manera de hacerlo es usar while
Cita:
var funcs = [];
var i = 0;
while(i < 3) {

funcs.push(function () {
var index = i;
console.log(index);
});
i++;
}


for (var i in funcs) {
funcs[i]()
}
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #5 (permalink)  
Antiguo 27/07/2014, 07:08
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Problema con closure

Y también con el bucle for y sin funciones anónimas:

Código Javascript:
Ver original
  1. var funcs = [];
  2. for (var i = 0; i < 3; funcs.push(function(){console.log(i)}), i++);
  3.  
  4. for (var i in funcs) {
  5.     funcs[i]();
  6. }
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #6 (permalink)  
Antiguo 27/07/2014, 10:03
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Problema con closure

buenas!!!
no voy a debatir cuál es mejor o cuál es peor... en mi opinión cualquier bucle funciona. a lo que voy, los últimos dos ejemplos están mal; no hay un closure de la variable. es cierto que para el caso particular, console.log imprime el valor correcto. sin embargo, ¿imprimirá el valor correcto más adelante? o sea, si al final invocamos las funciones, cada una imprime el último valor de la variable.
Código:
funcs[0](); // 2
funcs[1](); // 2
funcs[2]();  // 2
el único que funciona correctamente es el primer ejemplo de @alexis88.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:35.