Что может вызвать повреждение памяти в JavaScript? - PullRequest
16 голосов
/ 25 января 2012

Я разрабатываю приложение, которое использует редакторы TinyMCE, чтобы позволить пользователю изменять контент. Я разработал класс Prototype.js, который после инициализации генерирует уникальный идентификатор и создает редактор TinyMCE на <div> с этим идентификатором. Вот некоторые из соответствующих кодов:

Region = Class.create(
{
  initialize: function(options)
  {
    this._editorReady = false;
    this._index = Region.nextIndex++;
    this._uid = com.digitalfruition.Customizer.TypeRegion.uidPrefix+this._index;
    Region.instances.push(this);
    this.setupTinyMCE();
  },

  uid: function()
  {
    return this._uid;
  },

  index: function()
  {
    return this._index;
  },

Во многих местах я буду ссылаться на Region uid(), например, когда события происходят в редакторе TinyMCE (например, выбор изменяется), моим обработчикам присваивается идентификатор редактора. , Я часто буду делать:

var index = Region.instances.invoke('uid').indexOf(uid);

Чтобы найти фактический Region экземпляр, отражающий интерфейс, в котором произошли события.

Я только когда-либо устанавливал свойство _uid любого данного Region один раз . Я в этом уверен.

Но в Firefox 9.0.1 я вижу странное поведение. Когда события запускаются, редактор, с которым они работают, не может быть найден, потому что index в коде выше равен -1. После проверки в Firebug я увидел это:

Screen Capture of odd behavior

Это отладочные сообщения из моего кода, регистрирующие различные вещи (в данном случае высоту регионов) вместе со значением this.uid() региона. Кажется, что память повреждена! и вы даже можете увидеть, где это происходит, первая запись в журнале обведена правильно, а последующие - неправильно.

Один и тот же код отлично работает в Safari и Chrome. Пока что похоже только на Firefox 9.0.1 ...

Для дальнейшей проверки я запустил это в консоли Firebug:

>>> com.digitalfruition.Customizer.TypeRegion.instances.invoke('uid');
["�ᔮ��蒦ᓤ�瀀魳ᓪ�倀⛺ᓪ�怀�eg����遀"]

Это не имеет смысла для меня. Что может привести к повреждению памяти, как это в JavaScript? Как мне вообще разобраться с такой ситуацией?

1 Ответ

1 голос
/ 25 января 2012

Возможно ли, что один из ваших файлов будет сохранен в другой кодировке?Я бы посмотрел на это, а также, возможно, удостоверился, что вы обслуживаете файлы с правильными типами кодировки и MIME.

Возможно, было бы неплохо провести некоторое тестирование, при котором вы console.log() значения uid генерируются, чтобы подтвердить, что на самом деле происходит повреждение после создания объектов.Я подозреваю, что это происходит, когда они созданы.

...