2011-02-02 8 views
11

¿Está bien hacer esto ?:`` sin new` delete` en la misma variable en Javascript

function mygetTime() 
{ 
    var d = new Date(); 
    return(d.getTime()); 
} 

function wasteSomeMemory() 
{ 
    var temp; 
    for(var count = 0; count < 1000000; count += 1) 
    { 
     temp = mygetTime(); 
    } 
} 

Will llamando wasteSomeMemory() causa una pérdida de memoria?

Qué tal esto:

function wasteSomeMemory2() 
{ 
    var temp; 
    for(var count = 0; count < 1000000; count += 1) 
    { 
     temp = new Date(); 
    } 
} 

Will llamando wasteSomeMemory2() causa una pérdida de memoria? ¿Debo usar delete temp; al final del for-loop?

function wasteSomeMemory2() 
{ 
    var temp; 
    for(var count = 0; count < 1000000; count += 1) 
    { 
     temp = new Date(); 
     delete temp; 
    } 
} 

Respuesta

29

new y delete tienen nada que ver uno con el otro en JavaScript (a pesar de su similitud con confuso completamente diferentes construcciones en otros idiomas). No se preocupe por crear objetos (new) sin limpiarlos explícitamente, ese es el trabajo del recolector de basura.

new es para crear objetos a través de funciones de constructor. delete, por otro lado, es para eliminar propiedades de objetos. Tiene nada relacionado con la eliminación de un objeto de la memoria, que no sea un efecto secundario (por ejemplo, si la única referencia pendiente de ese objeto era de la propiedad que eliminó).

Ejemplo de uso correcto de delete:

var obj = {}; 
obj.foo = "bar"; // Now `obj` has a property called `foo` 
delete obj.foo; // Now it doesn't 

Su función getmyTime está perfectamente bien. El objeto Date será elegible para ser reclamado inmediatamente después de la devolución de la función (si es reclamado se debe completamente a la implementación). No causa una pérdida de memoria, excepto en una implementación con errores.

Su wasteSomeMemory2 de manera similar no causa una pérdida de memoria, y de hecho se puede no llamada delete temp;   — sólo se puede eliminar propiedades, no VARS.


Hay son momentos en los que tiene que ayudar al recolector de basura, pero los que habitualmente no lo hacen (en mi experiencia) tienen que ver con las propiedades del objeto y por lo tanto no implican delete. Solo aparecen cuando se crean instancias de función (lo cual es bastante frecuente, si está configurando manejadores de eventos o funciones de temporizador, etc.). Por ejemplo, considere:

function foo() { 
    var listOfThings = /* ...get a list of things... */; 

    // ...do something with `listOfThings`... 

    setInterval(function() { 
     // ...do something that *doesn't* need `listOfThings`... 
    }, 1000); 
} 

Debido a que su función anónima que ha asignado a través de un temporizador setInterval sobrevivirá a la llamada a la función, se mantiene una referencia en vivo a todo lo que estaba en el estudio durante dicha llamada de función (si se lo usa o no). Esto mantiene la lista de cosas que apunta a listOfThings en la memoria. Si la función del temporizador no necesita esa lista, es una preocupación. Puede soltar la lista que listOfThings puntos a si se sabe que la función no lo necesita, mediante la asignación de undefined o null o lo que sea a listOfThings cuando haya terminado con él:

function foo() { 

    var listOfThings = /* ...get a list of things... */; 

    // ...do something with `listOfThings`... 

    listOfThings = undefined; // Done with it   <== The new bit 

    setInterval(function() { 
     // ...do something that *doesn't* need `listOfThings`... 
    }, 1000); 
} 

Lo mismo es cierto para funciones de controlador de eventos, etc.Cada vez que creas una función, "cierra" (guarda una referencia en vivo) cualquier cosa en el ámbito donde fue definida. Entonces, si no necesita esas cosas, puede asegurarse de que no se guarden en la memoria borrando las referencias a ellas. (Más: Closures are not complicated)

4

La respuesta corta es no.

La respuesta larga es que esperamos que el recolector de basura de Dios lo capte.

Cuestiones relacionadas