3

我有一个页面可以作为独立网页使用,也可以在特殊的“看门狗框架”中使用,它会定期向其发送消息window.top.postMessage('message', '*');

问题是如果页面作为独立网页加载,将无法捕获这些消息。可以期望用户一次保持该页面打开数小时甚至数天。

这些未捕获的消息是否会消失得无影无踪,或者它们是否会排队或类似的事情,泄漏内存?

4

1 回答 1

5

postMessage在目标上启动 a 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);
};
于 2013-04-16T09:23:24.137 回答