¿Alguien puede explicar en detalle cómo los motores de Javascript manejan las referencias circulares? ¿Hay una gran diferencia entre los navegadores o incluso node.js?Referencias circulares en Javascript/Recolector de basura
De lo que estoy hablando es de una referencia atrás/siguiente explícita dentro de los objetos. Por ejemplo:
var objA = {
prop: "foo",
next: null
};
var objB = {
prop: "foo",
prev: null
};
objA.next = objB;
objB.prev = objA;
Ahí vamos. Si hacemos un console.log(objA)
, podemos ver que creamos una cadena infinita. La gran pregunta es, ¿es esto malo? ¿Crea fugas de memoria cuando no se limpian explícitamente?
Así que lo que tenemos que
objA.next = null;
objB.prev = null;
o serán los recolectores de basura cuidar de nosotros en constelaciones como esto?
¿Qué pasa con http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml?showone=Closures#Closures ¿está mal? – Sandro
@Sandro leyó mi respuesta nuevamente. :) Un GC sano maneja ciclos muy bien. Todo lo que es más nuevo que IE6 se puede considerar cuerdo. Si necesita soportar IE6, debe preocuparse por el manejo incorrecto de los ciclos. Aparentemente, la guía de Google está escrita bajo la suposición de que esos navegadores rotos deben ser compatibles, por lo que deben saltar algunos aros adicionales. – jalf
@Sandro Hay algo especial en ese ejemplo: un elemento DOM es una parte de la referencia circular. En general, se perdería la memoria hasta que cierre la página. Si recuerdo correctamente, sin embargo, IE no siempre elimina las referencias al DOM cuando navegas. (Al parecer, ¿eso rompió algunas páginas?) –