Tengo la siguiente función:

var counter = 0;

test();

function test() {
    counter++;
    alert(counter);
    setTimeout(function() { test() }, 100);
}

¿Esto creará algún problema con la memoria? es decir: ¿saldrá la función test () normalmente antes de que setTimeout () vuelva a llamarla?

Mis pruebas muestran que sale antes de volver a llamar a la función, pero un compañero de trabajo está seguro de que causará problemas de memoria.

Actualización: Realicé una prueba con Chrome y vi su Administrador de tareas, y el uso de la memoria no cambió.

testSetTimeout(0);

function testSetTimeout(a) {
    $("body").html(a);
    var v = new Array();
    for (var i = 0; i < 20000; i++)
        v.push("abcdefghijklmnopqrstuvwxyz");
    setTimeout(function () { testSetTimeout(a + 1); }, 0);
}

Sin embargo, al cambiar este código para llamar a testSetTimeout () directamente, se ejecutó aproximadamente 8000 veces y luego se cayó, en Chrome.

0
Emily Samantha Heiner 27 oct. 2017 a las 20:44

3 respuestas

La mejor respuesta

Debería estar bien, ya que la llamada a test () se colocará en la pila de llamadas de la función setTimeout, no test (), por lo que no explotará la pila

0
holtc 27 oct. 2017 a las 17:51

Sí, como dijiste, causará el problema de memoria. Cuando test() llama por primera vez setTimeout() mantendría el alcance del disparador inicial. Cada llamada funcional mantendrá setTimeout() en la pila y provocará una pérdida de memoria debido a la pila llena.

var counter = 0;

test();

function test() {
  counter++;
  if(counter >20) return; // This will make the function to exit.
  setTimeout(function() { test() }, 100);
}
-1
Vali Shah 27 oct. 2017 a las 18:22

Cada vez que se llama a test(), se crea una nueva instancia. Esa instancia tiene que mantener una relación con el lugar desde donde se llamó, de lo contrario se convierte en un 'zombie'. Cada vez que tienes un zombie autorreplicante en el código, no es un buen código. Por otro lado, si no se convierte en un zombie y mantiene esa referencia de donde fue llamado, tiene una recursión no intencional que es básicamente una pérdida de memoria. La forma correcta de hacer esto y no perder memoria sería:

setInterval(test, 100};
function test(){
    doWHATEVER…
}
0
Ankur Ankan 1 nov. 2017 a las 17:02