Что может привести к повреждению памяти в JavaScript? - программирование
Подтвердить что ты не робот

Что может привести к повреждению памяти в JavaScript?

Я разрабатываю приложение, которое использует редакторы 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? Как мне даже решить проблему с такой ситуацией?

4b9b3361

Ответ 1

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

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