(esto es bastante fuera de la manga.)
uso de memoria es de hecho un problema que necesita para estar preocupados con la actual estado actual del navegador, aunque a menos que hablemos de bastante código, no sé si el problema es el tamaño del código (generalmente es el tamaño del DOM y los manejadores de eventos sobrantes).
Puede utilizar un patrón para sus módulos cargables que lo haría mucho más fácil descargarlos en masa - o al menos, para que el navegador lo sepa puede descargarlos.
considerar:
window.MyModule = (function() {
alert('This happens the moment the module is loaded.');
function MyModule() {
function foo() {
bar();
}
function bar() {
}
}
return MyModule;
})();
Eso define un cierre que contiene las funciones y foo
bar
, que pueden llamarse entre sí de la forma habitual. Tenga en cuenta que el código fuera de las funciones se ejecuta inmediatamente.
Siempre que no pase ninguna referencia a lo que hay dentro del cierre a nada que esté fuera de él, entonces window.MyModule será la única referencia a ese cierre y su contexto de ejecución. Para descargarlo:
try {
delete window.MyModule;
}
catch (e) {
// Work around IE bug that doesn't allow `delete` on `window` properties
window.MyModule = undefined;
}
que le dice al entorno de JavaScript no está utilizando esa propiedad más, y hace todo lo que hace referencia disponible para la recolección de basura. Cuándo y si esa colección sucede obviamente depende de la implementación.
Tenga en cuenta que será importante si enlaza manejadores de eventos dentro del módulo para desengancharlos antes de descargarlos. Se podría hacer eso, devolviendo una referencia a una función de destructor en lugar del cierre principal:
window.MyModule = (function() {
alert('This happens the moment the module is loaded.');
function foo() {
bar();
}
function bar() {
}
function destructor() {
// Unhook event handlers here
}
return destructor;
})();
Desenganche es entonces:
if (window.MyModule) {
try {
window.MyModule();
}
catch (e) {
}
try {
delete window.MyModule;
}
catch (e) {
// Work around IE bug that doesn't allow `delete` on `window` properties
window.MyModule = undefined;
}
}
¿Por qué no eliminar MYAPP o MYAPP = undefined? – Dykam
No solo la variable en sí misma, sino también cualquier cierre que pueda crearse son las funciones internas. – txwikinger
@txwinker: Sí, creo que sentí que estaba implícito. Para que esto funcione, no debe haber referencias a MYAPP ni a nada dentro de él. Y hay algunos detalles delicados cuando se trata de perder memoria e IE. @Dykam: No hay razón para no estar indefinido, pero evité eliminar, ya que no tengo mucha experiencia con él, y un "1" no debería poner una gran tensión de memoria en lo que sea que el OP pueda estar haciendo. – Svend