从内存中卸载Javascript

时间:2016-01-25 16:26:50

标签: javascript ajax

我正在考虑浏览器上的Web应用程序。我可以在遍历应用程序的不同部分时根据需要动态添加所需的js文件,但是随着内存使用量的增长,我可以从当前会话的“内存”中卸载不必要的js内容吗?

我知道可以删除负责内容的标签,但不能保证它最终会卸载并取消绑定与该内容相关的所有内容。

谢谢

1 个答案:

答案 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
    };
})();

回调机制非常粗糙,你想要更好的东西。但它证明了这一概念。