未处理的 postMessage 会泄漏内存吗?

SF.*_*SF. 2 javascript memory-leaks postmessage

我有一个页面可以作为一个独立的网页或在一个特殊的“看门狗框架”中工作,它将定期使用 window.top.postMessage('message', '*');

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

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

Rob*_*b W 5

postMessageMessageEvent对目标发起 a ,这并不比常规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;
}
Run Code Online (Sandbox Code Playgroud)

有什么问题?图像的onload处理程序在加载时将图片插入到文档中。但是因为闭包,event对象不能被释放,大event.data对象还是会占用内存。

另一种引入内存泄漏(仅同源)的方法是保存event.source(防止框架的视图在框架被移除时被 GC 处理)的值:

var stupidity = [];
window.onmessage = function(event) {
    stupidity.push(event.source);
};
Run Code Online (Sandbox Code Playgroud)