7
function fetchXmlDoc(uri) { 
    var xhr = new XMLHttpRequest(); 
    var async = false; 
    xhr.open("GET", uri, async); 
    xhr.send(); 

    return xhr.responseXML; 
} 

Básicamente, cuando llamo a esta función, será el objeto xhr obtener recolección de basura, o va a quedarse para siempre, porque la persona que llama está aferrando a xhr.responseXML? Si es el último, ¿esto lo resolvería?¿Recolectará este código JavaScript basura como yo esperaba?

function fetchXmlDoc2(uri) { 
    var xhr = new XMLHttpRequest(); 
    var async = false; 
    xhr.open("GET", uri, async); 
    xhr.send(); 

    var xml = xhr.responseXML; 
    return xml; 
} 

A pesar de todos los años de JS, todo el asunto de administración de memoria se las arregla para confundirme ...

+0

PD Sé que Jax (es decir, Ajax sin el A) generalmente es malo, pero en este caso está trabajando con el sistema de archivos local, por lo que no es tan malo. – Domenic

+3

Eso depende de, por ejemplo, si 'xhr.responseXML' contiene una referencia a' xhr'. – delnan

Respuesta

2

La propiedad responseXML del objeto XHR es una referencia al objeto de datos real (tal como usted asumió implícitamente en el segundo fragmento de código: no está copiando los datos, está copiando la referencia).

Así que el objeto xhr eventualmente obtendrá basura recolectada. Solo hay una referencia a esto: aquí mismo en esta función donde se crea.

+0

Bien, bien, entonces debería imaginar una "caja" en la memoria que contenga un objeto 'Document', al cual' xhr.responseXML' es una referencia. Pero al devolver 'xhr.responseXML', estoy creando una nueva referencia a esa" caja ", sin relación con la que está asociada a' xhr'. Tiene sentido ahora que lo pienso ... ¡gracias! – Domenic

Cuestiones relacionadas