有一个很好的富文本编辑器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实例。
知道怎么处理这个吗?
答案 0 :(得分:1)
您不需要自己删除该对象。如果将引用它的所有变量设置为null
,它将自动删除。该对象很可能仍然存在,因为代码中的其他部分引用了它。如果您无法找到其他引用,则可以将其设置为空对象,然后将scribe
设置为null,如下所示:
function destroy() {
for(var i in scribe)
{
delete scribe[i];
}
scribe = null;
}
这将至少释放一些记忆。真正摆脱它的唯一方法是将引用它的所有变量设置为null
。