未处理的postMessage是否会导致内存泄漏?

3

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

问题是,如果该页面作为独立网页加载,就没有任何东西来捕获这些消息。用户可能会将该页面保持打开状态数小时甚至数天。

这些未被捕获的消息会消失无踪,还是会排队等待或类似泄漏内存的操作?


1
postMessage 会触发 MessageEvent 的分发,类似于文档上的点击会触发 MouseEvent。你为什么认为会有内存泄漏? - Rob W
1
@RobW:我以前从未使用过postMessage机制,而且我根本不知道它背后的原理是什么——是事件、队列还是套接字?如果你能回答这个问题,我会接受你的回答,“它的行为与事件完全相同”正是我想听到的。 - SF.
1个回答

5

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帧的视图):
var stupidity = [];
window.onmessage = function(event) {
    stupidity.push(event.source);
};

1
那么,如何正确释放通过postmessage发送的对象呢?例如:something=new object, postmessage(something)。然后 - 不管什么原因 - postmessage没有被处理,但是应用程序销毁了。postmessage队列需要“something”来确保内部队列和特殊对象在未被处理时被释放。或者这只是被认为是极其不好的做法? - T.S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接