/ / tratar con bucles en javascript, solo el último elemento se ve afectado? [duplicado] - javascript, cierres

tratar con bucles en javascript, solo el último elemento se ve afectado? [duplicado] - javascript, cierres

Estoy trabajando con el módulo gm npm que se ocupa de la manipulación de imágenes. y tengo este codigo

for(i=0;i < 4;i++){
gm("www/img/" + image[i]).crop(550, 406, 0, 0).write(function(err) {
console.log(this.outname + " created  ::  " + arguments[3]); //success
});
}

Este bucle está destinado a recorrer las imágenes.Arregla y recorta cada foto, pero solo recorta la última. Creo que es algo para hacer invocación de funciones y devoluciones de llamada, pero aún no avanzado para ese nivel.

Respuestas

4 para la respuesta № 1

Cambia tu código a:

for (var i = 0; i < 4; i++) {
(function (i) {
gm("www/img/" + image[i]).crop(550, 406, 0, 0).write(function(err) {
console.log(this.outname + " created  ::  " + arguments[3]); //success
});
}).call(this, i);
}

de lo contrario el valor de i será 3 cada vez que se invoque su devolución de llamada.


3 para la respuesta № 2

Necesitas crear un "cierre" sobre la variable

Js tiene un función alcance.

for (i = 0; i < 4; i++)
{
(function (a)
{
gm("www/img/" + image[a]).crop(550, 406, 0, 0).write(function (err)
{
console.log(this.outname + " created  ::  " + arguments[3]); //success
});
}).call(this,i)
}

o

that=this;

for (i = 0; i < 4; i++)
{
(function (a)
{
gm("www/img/" + image[a]).crop(550, 406, 0, 0).write(function (err)
{
console.log(that.outname + " created  ::  " + arguments[3]); //success
});
})(i)
}

editar:

También - lo haría también mantener una referencia a la arguments Desde ahora, después de IIFE - los argumentos están cambiando.

puedes mantener tu arguments a través de

var args= Array.prototype.slice.apply(arguments)

ejemplo:

function g()

{
for (i = 0; i < 4; i++)
{
(function (a)
{
console.log(arguments); //huh ? arguments are not a,b,c !!! anymore
})(i);
}
}


g("a","b","c") // 0,1,2,3

por lo tanto, es necesario mantener la referencia a los argumentos que se cambiaron después de IIFE.