Утечка памяти в необработанном сообщении postMessage?

У меня есть страница, которая может работать как отдельная веб-страница или в специальном «сторожевом фрейме», на который она будет периодически отправлять сообщения, используя window.top.postMessage('message', '*');

Проблема в том, что если страница загружается как отдельная веб-страница, захватывать эти сообщения нечего. Можно ожидать, что пользователи будут держать эту страницу открытой в течение нескольких часов или даже дней.

Эти неперехваченные сообщения просто исчезают без следа, или они попадают в очередь или что-то в этом роде, что приводит к утечке памяти?


person SF.    schedule 16.04.2013    source источник
comment
postMessage вызывает отправку MessageEvent, аналогично тому, как щелчок по документу запускает MouseEvent. Почему вы ожидаете утечки памяти?   -  person Rob W    schedule 16.04.2013
comment
@RobW: Я никогда раньше не использовал механизм postMessage и просто не знал, что за ним стоит - событие, очередь, сокет? - опубликуйте это в качестве ответа, и я приму, он ведет себя точно так же, как события, - это именно то, что я надеялся услышать.   -  person SF.    schedule 16.04.2013


Ответы (1)


postMessage инициирует MessageEvent на цели, что не является более особенным, чем обычное onload событие.

Само событие не вызывает утечек памяти. Вы можете создавать утечки памяти, вводя нежелательные закрытия, но это также относится и к обычным функциям:

window.addEventListener('message', messageHandler, false);
function messageHandler(event) {
    var img = new Image();
    img.onload = function() {
        document.body.appendChild(img);
    };
    img.src = event.data.some.property.deep.ly.nested.obj.bad.coding.style.src;
}

В чем проблема? Обработчик onload изображения вставляет изображение в документ при его загрузке. Однако из-за закрытия объект event не может быть освобожден, а большой объект event.data по-прежнему будет занимать память.

Другой способ ввести утечку памяти (только с одним и тем же происхождением) - сохранить значение event.source (предотвращение GC'd представления кадра при удалении кадра):

var stupidity = [];
window.onmessage = function(event) {
    stupidity.push(event.source);
};
person Rob W    schedule 16.04.2013