2010-09-24 6 views
13

acabo de leer esta pregunta y la respuesta aceptada: What is JavaScript garbage collection?Recolección de basura y JavaScript "eliminar": ¿Es esto exceso/ofuscación, o una buena práctica?

En la respuesta, Noldorin hace referencia algunas pautas de Apple. Aquí está la parte que me preocupa:

Utilice las instrucciones de eliminación. Siempre que cree un objeto usando una nueva instrucción, emparejelo con una declaración de eliminación. Esto garantiza que toda la memoria asociada con el objeto, incluido su nombre de propiedad, esté disponible para la recolección de elementos no utilizados.

Siempre me tomo el tiempo para mantenerme al día sobre las mejores prácticas, especialmente si puedo reducir la huella de memoria de mis scripts. Entonces fui a probar algunas cosas. Si entiendo correctamente, el siguiente es un ejemplo de un objeto que se elimina después de invocar un método.

var thing = function() { 
    var a_method, and_another; 
    a_method = function() { /* do stuff */ }; 
    and_another = function() { /* do some other stuff*/ }; 
    this.init = function() { a_method(); and_another(); }; 
}; 
delete new thing().init(); 

Normalmente voy a envolver todo en una función de invocación automática y pasar mis globales al igual que arriba. Todo es igual a como lo haría normalmente, la única diferencia es que agregué el delete justo antes del new.

El código funciona de cualquier manera.

Entonces la pregunta es: ¿Estoy haciendo cualquier cosa aquí? ¿Hay algún tipo de beneficio al eliminar una referencia a un objeto que solo existe dentro de un ámbito de función? ¿O solo estoy haciendo que las cosas se vean confusas?

+0

dejé de hacer la recolección de basura al igual que hace diez años :) –

Respuesta

33

En primer lugar, la afirmación delete new scoped_object().init(); no está realmente haciendo nada, es mejor que se preocupe por qué variables permanecen en cierre o si tiene referencias circulares, que son la fuente más común de memory leaks.

El operador delete está destinado a ser utilizado para propiedades de los objetos de borrado, y es realmente mal entendido, la respuesta que cita de @Noldorin cita un texto del Apple JavaScript "Best Practices", pero que no tienen ni idea acerca de cómo funciona delete !!

Incluso recomiendan el uso de delete en referencias a variables, y que no es posible -sólo posible que las variables declaradas en Código Eval -, porque la declaración var declara la variable como no eliminable ({DontDelete} en ECMAScript 3, o [[Configurable]] = false en ECMAScript 5) propiedades del Objeto Variable -objetos que forman la cadena de alcance-.

Por otra parte, el intento de delete una referencia a un identificador que está enlazado a un registro medio ambiente - un identificador declarado con un VariableDeclaration, o desde FunctionDeclaration de una función FormalParameterList -, provoca una excepción SyntaxError en el nuevo ECMAScript 5th Edition bajo Strict Mode.

Yo recomendaría que lea el siguiente artículo sobre delete:

+0

Eso es impresionante. ¡Gracias! – Stephen

+2

+1 para el enlace al artículo de Kangax. Artículo impresionante! – Rajat

Cuestiones relacionadas