摧毁物体

时间:2014-04-24 18:05:44

标签: javascript amd

有一个很好的富文本编辑器Scribe。在我的应用程序中,我在页面上有多个可编辑的div,并且在特定div上的每个focus事件上,我想使用Scribe将此div转换为可编辑模式。但是在blur事件中,我想销毁Scribe的实例,因为每个div都有一个单独的实例会占用大量内存。

这是我的AMD模块,它将Scribe实例附加到给定的DOM元素:

define(['scribe'], function (Scribe) {

    'use strict';

    function init(element) {
        var scribe = new Scribe(element, { allowBlockElements: true });
        //...    
    }

    return {
        attachEditor: init
    };
});

这是使用上述模块的代码片段:

$('.editable').focus(function(e) {
  editorModule.attachEditor(e.target);
});

现在我无法弄清楚如何分离或破坏现有的Scribe实例。我试过这段代码:

define(['scribe'], function (Scribe) {

    'use strict';
    var scribe;
    function init(element) {
        scribe = new Scribe(element, { allowBlockElements: true });
        //...    
    }

    function destroy() {
        scribe = null;
    }

    return {
        attachEditor: init,
        detachEditor: destroy,
    };
});

希望将null赋给变量将告诉GC删除该对象。我怀疑这是一个好方法 - 当我在Chrome中获取内存快照时,我仍然可以看到Scribe实例。

知道怎么处理这个吗?

1 个答案:

答案 0 :(得分:1)

您不需要自己删除该对象。如果将引用它的所有变量设置为null,它将自动删除。该对象很可能仍然存在,因为代码中的其他部分引用了它。如果您无法找到其他引用,则可以将其设置为空对象,然后将scribe设置为null,如下所示:

function destroy() {
   for(var i in scribe)
   {
       delete scribe[i];
   }
   scribe = null;
}

这将至少释放一些记忆。真正摆脱它的唯一方法是将引用它的所有变量设置为null

相关问题