我正在考虑浏览器上的Web应用程序。我可以在遍历应用程序的不同部分时根据需要动态添加所需的js文件,但是随着内存使用量的增长,我可以从当前会话的“内存”中卸载不必要的js内容吗?
我知道可以删除负责内容的标签,但不能保证它最终会卸载并取消绑定与该内容相关的所有内容。
谢谢
答案 0 :(得分:5)
我知道可以删除负责内容的标签,但不能保证它最终会卸载并取消绑定与该内容相关的所有内容。
事实上,它确保不会。加载并执行JavaScript后,它与加载它的script
元素之间没有链接。
您可以动态加载和卸载模块,但必须通过
将其设计到代码中然后卸载模块就是调用它的unload
函数,然后将引用它的符号设置为undefined
(或者将它完全删除,如果它是对象的属性) )。
这是一个非常简单的概念演示(如果你使用的是某种异步模块定义库,你可以适应它):
// An app-wide object containing a property for each module.
// Each module can redefine it in this way without disturbing other modules.
var AppModules = AppModules || {};
// The module adds itself
AppModules.ThisModule = (function() {
var unloadCallbacks = [];
function doThis() {
// Perhaps it involves setting up an event handler
var element = document.querySelector(/*...*/);
element.addEventHandler("click", handler, false);
unloadCallbacks.push(function() {
element.removeEventHandler("click", handler, false);
element = handler = undefined;
});
function handler(e) {
// ...
}
}
function doThat() {
// ...
}
function unload() {
// Handle unloading any handlers, etc.
var callbacks = unloadCallbacks;
unloadCallbacks = undefined;
callbacks.forEach(function(callback) {
callback();
});
// Remove this module
delete AppModules.ThisModule;
}
return {
doThis: doThis,
unload: unload
};
})();
回调机制非常粗糙,你想要更好的东西。但它证明了这一概念。