objects functions built javascript weak-references

functions - default objects in javascript



¿Es posible crear una "referencia débil" en javascript? (7)

¿Hay alguna forma en javascript para crear una "referencia débil" a otro objeto? Aquí está la página wiki que describe qué es una referencia débil. Aquí hay otro artículo que los describe en Java. ¿Alguien puede pensar en una forma de implementar este comportamiento en javascript?



EcmaScript 6 (ES Harmony) tiene un objeto WeakMap . El soporte para navegadores entre los navegadores modernos es bastante bueno (las últimas 3 versiones de Firefox, Chrome e incluso una próxima versión de IE lo admiten).


No hay soporte de idiomas para revisiones débiles en JavaScript. Puede hacer su propio cálculo utilizando el recuento manual de referencias, pero no especialmente sin problemas. No puede crear un objeto envoltorio de proxy, porque en los objetos de JavaScript nunca se sabe cuándo están a punto de ser recolectados.

Así que su "referencia débil" se convierte en una clave (por ejemplo, entero) en una búsqueda simple, con un método de referencia de adición y eliminación de referencia, y cuando ya no hay referencias de seguimiento manual, la entrada puede eliminarse, dejando búsquedas futuras en esa tecla para devolver nulo.

Esto no es realmente un defecto, pero puede resolver algunos de los mismos problemas. Normalmente se realiza en aplicaciones web complejas para evitar la pérdida de memoria de los navegadores (generalmente IE, especialmente versiones anteriores) cuando hay un bucle de referencia entre un nodo DOM o controlador de eventos, y un objeto asociado a él, como un cierre. En estos casos, puede que ni siquiera sea necesario un esquema completo de recuento de referencias.



Usar un mecanismo de caché para emular una referencia débil, como sugirió above , es razonable. Si las referencias débiles existirían de forma nativa, observaría un comportamiento como este:

this.val = {}; this.ref = new WeakReference(this.val); ... this.ref.get(); // always returns val ... this.val = null; // no more references ... this.ref.get(); // may still return val, depending on already gc''d or not

Mientras que con un caché observaría:

this.val = {}; this.key = cache.put(this.val); ... cache.get(this.key); // returns val, until evicted by other cache puts ... this.val = null; // no more references ... cache.get(this.key); // returns val, until evicted by other cache puts

Como titular de una referencia, no debe hacer suposiciones sobre cuándo se refiere a un valor, esto no es diferente usando un caché


Verdaderas referencias débiles, no, aún no (pero los fabricantes de navegadores están mirando el tema). Pero aquí hay una idea sobre cómo simular referencias débiles.

Puedes construir un caché al que conduces tus objetos. Cuando se almacena un objeto, el caché guarda una predicción de cuánta memoria ocupará el objeto. Para algunos elementos, como el almacenamiento de imágenes, esto es sencillo de realizar. Para otros esto sería más difícil.

Cuando necesitas un objeto, luego le pides el caché. Si la memoria caché tiene el objeto, se devuelve. Si no está allí, el elemento se genera, almacena y luego se devuelve.

Las referencias débiles son simuladas por los elementos de eliminación de caché, cuando la cantidad total de memoria predicha alcanza un cierto nivel. Predecirá qué elementos son los menos utilizados en función de la frecuencia con la que se recuperan, ponderando cuánto tiempo hace que fueron retirados. También se puede agregar un costo de "cálculo" si el código que crea el elemento se pasa a la memoria caché como cierre. Esto permitiría a la memoria caché mantener artículos que son muy costosos de construir o generar.

El algoritmo de eliminación es clave, porque si lo haces mal, podrías terminar eliminando los artículos más populares. Esto causaría un rendimiento terrible.

Siempre que la memoria caché sea el único objeto con referencias permanentes a los objetos almacenados, entonces el sistema anterior debería funcionar bastante bien como una alternativa a las referencias débiles verdaderas.


http://www.jibbering.com/faq/faq_notes/closures.html

ECMAScript utiliza la recolección de basura automática. La especificación no define los detalles, dejando que los implementadores los clasifiquen, y se sabe que algunas implementaciones otorgan una prioridad muy baja a sus operaciones de recolección de basura. Pero la idea general es que si un objeto no se puede referenciar (al no tener referencias remanentes disponibles para ejecutar el código) está disponible para la recolección de basura y en algún punto futuro se destruirá y todos los recursos que está consumiendo serán liberados y devueltos al sistema para su reutilización.

Esto normalmente sería el caso al salir de un contexto de ejecución. La estructura de la cadena de alcance, el objeto de Activación / Variable y cualquier objeto creado dentro del contexto de ejecución, incluidos los objetos de función, ya no serían accesibles y estarían disponibles para la recolección de basura.

Lo que significa que no hay otros débiles que ya no estén disponibles.