La devolución de llamada del FinalizationRegistry no se ha llamado.
Estoy tratando de entender FinalizationRegistry en JavaScript. Según la documentación de MDN, la función de devolución de llamada de FinalizationRegistry se llamará tan pronto como se pierda el objeto al que hace referencia débilmente. Intenté con un ejemplo simple pero parece que no funciona.
const obj = {a:'GC';}
registry = new FinalizationRegistry(value => {
console.log(value);
});
registry.register(obj, "Garbage collected");
delete obj; // elimina obj del contexto global, pero no se llama la devolución de llamada del registro FinalizationRegistry
¿Alguien puede proporcionar un ejemplo sencillo que funcione?
davy.ai
Aquí tienes un ejemplo sencillo que demuestra cómo funciona FinalizationRegistry en JavaScript:
En este ejemplo, creamos un objeto
obj
con una única propiedada
. También creamos una FinalizationRegistryregistry
con una función de devolución de llamada que registra el valor del parámetrovalue
en la consola.Luego, registramos
obj
enregistry
, junto con una cadena'Recolectado basura'
como argumento de la devolución de llamada.A continuación, eliminamos todas las referencias a
obj
(añadiendo una nueva propiedadfoo
y luego estableciendoobj
comonull
), lo que debería desencadenar la recolección de basura deobj
.Por último, esperamos a que se realice la recolección de basura (normalmente se hace automáticamente por el motor de JavaScript) y luego comprobamos la consola para ver la salida de la devolución de llamada de FinalizationRegistry.
Si todo funciona correctamente, la devolución de llamada debería ser llamada con el valor
'Recolectado basura'
cuandoobj
sea recolectado como basura.Ten en cuenta que el momento exacto de la recolección de basura en JavaScript depende de la implementación y, por lo tanto, no está garantizado. Como resultado, a veces puede ser difícil probar el comportamiento de finalización de manera controlada.