我有一个页面,它可以作为独立的网页使用,也可以在特殊的 "看门狗框架" 中使用。该页面会定期发送消息,使用 window.top.postMessage('message', '*');
问题是,如果该页面作为独立网页加载,就没有任何东西来捕获这些消息。用户可能会将该页面保持打开状态数小时甚至数天。
这些未被捕获的消息会消失无踪,还是会排队等待或类似泄漏内存的操作?
我有一个页面,它可以作为独立的网页使用,也可以在特殊的 "看门狗框架" 中使用。该页面会定期发送消息,使用 window.top.postMessage('message', '*');
问题是,如果该页面作为独立网页加载,就没有任何东西来捕获这些消息。用户可能会将该页面保持打开状态数小时甚至数天。
这些未被捕获的消息会消失无踪,还是会排队等待或类似泄漏内存的操作?
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);
};
postMessage
会触发MessageEvent
的分发,类似于文档上的点击会触发MouseEvent
。你为什么认为会有内存泄漏? - Rob W