Soy nuevo en la administración de memoria en JS, así que disculpe si esta es una pregunta tonta.
Supongamos que tengo un componente con tres funciones definidas y una declaración de cambio de caso que llama solo a una función según el caso coincidente. ¿Las otras dos funciones ocuparán la memoria o se recolectarán basura una vez que se ejecute la declaración de cambio?
function funcA() {};
function funcB() {};
function funcC() {};
switch(type) {
case 'funcA':
funcA();
break;
case 'funcB':
funcB();
break;
case 'funcC':
funcC();
break;
}
Si se define dentro del alcance de una función y no en el nivel superior del documento, cualquier variable local a la que se haga referencia solo dentro de ese alcance (incluidas las definiciones de función) se recolectará como basura en algún momento después de que la función termine de ejecutarse.
Puede verificar esto usando FinalizationRegistry así:
function memoryExperiment(type) {
function funcA() {};
function funcB() {};
function funcC() {};
const registry = new FinalizationRegistry((heldValue) => {
console.log(`Garbage collected ${heldValue}`)
});
registry.register(funcA, "funcA")
registry.register(funcB, "funcB")
registry.register(funcC, "funcC")
switch(type) {
case 'funcA':
funcA();
break;
case 'funcB':
funcB();
break;
case 'funcC':
funcC();
break;
}
return registry
}
const registry = memoryExperiment('funcA')
Se registra un mensaje para las tres funciones que indica que se recolectaron elementos no utilizados.
Es difícil predecir exactamente cuándo se recopilarán, ya que el algoritmo de recolección de elementos no utilizados toma decisiones en función de varios factores, pero en mis pruebas en un archivo html en Chrome que de otro modo estaría en blanco, por lo general es después de unos segundos.