1

我认为您从网络工作者使用“postMessage”发送的对象的序列化是使用 JSON.serialize 进行的,而反序列化是使用 JSON.parse 进行的。但是我用那个工作代码做了一个测试(在 Firefox 中):

function A() {
    this.id = 3;
    this.save;
}

var a1 = new A();
var a2 = new A();

a1.save = a2;

postMessage({
    'a1' : a1,
    'a2' : a2    
});

现在在主文件中你有:

w.onmessage = function(event) {
    event.data.a2.id = 7;
};

问题是之后 a1.save.id 中的值也是 7。所以必须有一个引用,但是当你使用 JSON.serialze 和 JSON.parse 时没有引用......那么序列化是如何进行的?我可以在所有浏览器中假设该引用吗?谢谢!

4

1 回答 1

2

不,Worker 通信不使用 JSON 进行序列化。您可以手动执行并传递字符串,但您不需要这样做。

MDN 声明

在主页和工作人员之间传递的消息是复制的,而不是共享的。对象在交给工作人员时会被序列化,然后在另一端反序列化。页面和工作人员不共享同一个实例,因此最终结果是在每一端都创建了一个副本。大多数浏览器将此功能实现为结构化克隆

事实上,Worker 规范postMessage说参数被传递给底层MessagePort的 's postMessage,并且被指定为在参数上使用结构化克隆算法message

于 2013-03-14T16:57:37.257 回答