Saltar al contenido

Se puede acceder a la variable mutable desde el cierre. ¿Cómo puedo arreglar esto?

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

Puntuaciones y reseñas

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *