我认为您发送的对象的序列化' postMessage'来自Web worker的是使用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时没有引用... 那序列化是怎么做的呢?我可以在所有浏览器中假设该引用吗? 谢谢!
答案 0 :(得分:2)
不,工作者通信不使用JSON进行序列化。您可以手动执行并传递字符串,但您不需要。
主页和工作程序之间传递的消息将被复制,而不是共享。对象在传递给工作者时被序列化,随后在另一端被反序列化。页面和工作程序不共享同一个实例,因此最终结果是在每一端创建了一个副本。大多数浏览器都将此功能实现为structured cloning。
事实上,Worker spec for postMessage
表示参数传递给基础MessagePort
的{{1}}和that one is specified以使用structured cloning algorithm postMessage
论证。