(这是相当现成的,袖口。)
内存使用确实需要在当前被关注的一个问题虽然除非我们谈论了很多代码,但我不知道代码大小是个问题(通常是DOM大小和剩余的事件处理程序)。
您可以使用可加载模块的模式,使其更容易卸载它们 - 或者至少让浏览器知道它可以卸载它们。
考虑:
window.MyModule = (function() {
alert('This happens the moment the module is loaded.');
function MyModule() {
function foo() {
bar();
}
function bar() {
}
}
return MyModule;
})();
即定义了包含功能foo
和bar
,其可以相互调用以正常方式的封闭件。请注意,函数外的代码会立即运行。
如果你不关闭封闭内部对封闭内部的任何引用,那么window.MyModule将是对该封闭封闭及其执行上下文的唯一引用。卸载它:
try {
delete window.MyModule;
}
catch (e) {
// Work around IE bug that doesn't allow `delete` on `window` properties
window.MyModule = undefined;
}
这告诉JavaScript环境你不再使用该属性,并使它引用可用于垃圾回收的任何东西。何时以及该集合是否发生显然取决于实施。
请注意,如果您在卸载之前钩住模块内的事件处理程序以解除它们,这将非常重要。你可以做到这一点的一个参考返回到构函数而不是主关闭:
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;
})();
脱钩则是:
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;
}
}
为什么不删除MYAPP或MYAPP = undefined? – Dykam 2009-08-28 13:17:30
不仅变量本身,而且任何可能创建的闭包都是里面的函数。 – txwikinger 2009-08-28 13:19:08
@txwinker:是的,我想我觉得那是暗示的。为了这个工作,不得提及任何MYAPP,也不能提及其中的任何内容。当涉及到泄漏内存和IE时,有一些令人费解的细节。 @Dykam:没有理由不去定义,但是我避免了删除,因为我对它没有太多的经验,而且“1”不应该给OP做任何事情带来巨大的内存压力。 – Svend 2009-08-28 13:34:50