El paso a paso o código que hallarás en este post es la resolución más fácil y efectiva que hallamos a tus dudas o dilema.
Solución:
me gusto el parrafo Cierres Bucles Interiores desde Jardín Javascript
Explica tres formas de hacerlo.
La forma incorrecta de usar un cierre dentro de un bucle
for(var i = 0; i < 10; i++)
setTimeout(function()
console.log(i);
, 1000);
Solución 1 con envoltorio anónimo
for(var i = 0; i < 10; i++)
(function(e)
setTimeout(function()
console.log(e);
, 1000);
)(i);
Solución 2 - devolver una función desde un cierre
for(var i = 0; i < 10; i++)
setTimeout((function(e)
return function()
console.log(e);
)(i), 1000)
Solución 3, mi favorito, donde creo que finalmente entendí bind
- ¡Yaay! unir FTW!
for(var i = 0; i < 10; i++)
setTimeout(console.log.bind(console, i), 1000);
Recomiendo encarecidamente Javascript Garden: me mostró esto y muchas más peculiaridades de Javascript (y me hizo gustar JS aún más).
PD: si tu cerebro no se derritió, no has tenido suficiente Javascript ese día.
Debe anidar dos funciones aquí, creando un nuevo cierre que capture el valor de la variable (en lugar de la variable misma) en el momento en que se crea el cierre. Puede hacer esto usando argumentos para una función externa invocada inmediatamente. Reemplace esta expresión:
function (item) // what to do when item is selected
comp = me.map[item];
if (typeof comp === 'undefined')
return this.query;
window.location.href = me.format(gotoUrl, comp.s, target.destination);
return item;
Con este:
(function (inner_target)
return function (item) // what to do when item is selected
comp = me.map[item];
if (typeof comp === 'undefined')
return this.query;
window.location.href = me.format(gotoUrl, comp.s, inner_target.destination);
return item;
(target))
Tenga en cuenta que pasamos target
en la función exterior, que se convierte en el argumento inner_target
, capturando efectivamente el valor de target
en el momento en que se llama a la función exterior. La función exterior devuelve una función interior, que utiliza inner_target
en vez de target
, y inner_target
no cambiará.
(Tenga en cuenta que puede cambiar el nombre inner_target
a target
y estarás bien -- lo más cercano target
se utilizará, que sería el parámetro de la función. Sin embargo, tener dos variables con el mismo nombre en un ámbito tan reducido podría ser muy confuso, por lo que las nombré de manera diferente en mi ejemplo para que pueda ver lo que sucede).
En ecmascript 6 tenemos nuevas oportunidades.
El dejar declaración declara una variable local de alcance de bloque, opcionalmente inicializándola a un valor. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let