Откуда происходит утечка памяти? - PullRequest
0 голосов
/ 27 марта 2012

Я использую старую версию extjs для отладки JS-кода.Я делаю этот вызов в своем коде:

Ext.History.add("text");

Внутренне Ext.History реализован так:

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

Проблема в том, что вызов Ext.History.add () вызывает памятьтечь по IE.Итак, предположим, Я, вероятно, хочу прекратить использование корпуса и сделать что-то вроде этого:

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

Но это вызывает ошибки.

Редактировать: ошибка возникла из-за добавленияметод внутри объекта истории.

1 Ответ

1 голос
/ 27 марта 2012

Какие у вас доказательства утечки памяти? Большинство из них были исправлены в IE, это определенно не было горячей темой в течение нескольких лет. В IE 6 и более ранних версиях IE 7 были проблемы с циклическими ссылками, связанными с объектами DOM, но они были в значительной степени исправлены даже в этих старых версиях.

Во всяком случае, в следующем:

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

непосредственно вызванное выражение функции (IIFE) справа имеет только замыкание во внешнюю область (которая выглядит как глобальный код). Вы не показываете, где есть какие-то проблемные закрытия, поэтому очень сложно комментировать.

Предположительно, 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;
  }
};

Обратите внимание, что это значение add должно быть History (например, назвать его Ext.History.add()), иначе оно не будет работать. Кроме того, переменные с именами, совпадающими с текущими свойствами, должны иметь новые имена.

Если вы публикуете весь код (или разумный фрагмент, который показывает шаблон), исправление может быть возможным. Или посмотрите новые версии и посмотрите, что они сделали, чтобы это исправить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...