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)