(这是相当现成的。)
在当前最先进的浏览器状态中,内存使用确实是一个您需要关注的问题,尽管除非我们谈论相当多的代码,否则我不知道代码大小是问题(通常是 DOM 大小) ,以及剩余的事件处理程序)。
你可以为你的可加载module使用一个模式,这样可以更容易地卸载它们——或者至少,让浏览器知道它可以卸载它们。
考虑:
window.MyModule = (function() {
alert('This happens the moment the module is loaded.');
function MyModule() {
function foo() {
bar();
}
function bar() {
}
}
return MyModule;
})();
这定义了一个包含函数foo
and的闭包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 环境您不再使用该属性,并使其引用的任何内容都可用于垃圾收集。该收集何时以及是否发生显然取决于实现。
请注意,如果您在module内挂钩事件处理程序以在卸载之前取消挂钩,这将很重要。您可以通过返回对析构函数而不是主闭包的引用来做到这一点:
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;
}
}