内存泄漏来自哪里?

时间:2012-03-26 23:08:53

标签: javascript memory-leaks

我正在使用旧版extjs来调试我的js代码。我在我的代码中打了这个电话:

Ext.History.add("text");

内部Ext.History实现如下:

Ext.History = (function () {/* code goes here. */ })();

问题是调用Ext.History.add()会导致IE上的内存泄漏。所以假设我可能想停止使用机箱并执行以下操作:

function History () {
   /* code */
}
Ext.History = History;

但这会导致错误。

编辑:错误来自历史对象内的add方法。

1 个答案:

答案 0 :(得分:1)

您对内存泄漏有什么证据?大多数已在IE中修复,它肯定不是几年来的热门话题。 IE 6和早期IE 7在涉及DOM对象的循环引用方面存在问题,但它们已经相当修复,即使在那些旧版本中也是如此。

无论如何,在下面:

> Ext.History = (function () {/* code goes here. */ })(); 

右边的立即调用的函数表达式(IIFE)只有一个对外部作用域的闭包(看起来像是glbal代码)。您没有显示任何有问题的闭包的位置,因此很难发表评论。

据推测,IIFE返回一个带有 add 属性的对象,该属性是一个函数,该函数对IIFE中声明的变量有一个闭包,例如:

Ext.History = (function () {
  var foo = 'foo';
  return {
    add: function(bar) {
      return foo + ' ' + bar;
    }
  }
})(); 

您可以使用对象和直接属性替换整个事物,例如:以下内容与上述内容相同,只是它访问 History 的属性而不是闭包:

Ext.History = {

  foo: 'foo',

  add: function (bar) {
    return this.foo + ' ' + bar;
  }
};

请注意,添加值必须为历史记录(例如将其称为Ext.History.add())否则不会工作。此外,名称与当前属性相同的变量需要赋予新名称。

如果您发布整个代码(或显示模式的合理块),则可能会进行修复。或者,查看新版本,看看他们为修复它做了些什么。