为什么变量在参考对象消失后仍包含数据

时间:2013-01-09 00:19:27

标签: javascript html iframe

iframe1.map_data=iframe2.map_data

这不是将iframe1.map_data设置为对iframe2.map_data的引用吗?

将新文件加载到iframe2时,为什么iframe1.map_data仍然包含数据?

3 个答案:

答案 0 :(得分:2)

让我们不要把iframe弄得一团糟。

var obj1 = {
  a: {test: 123};
}

var obj2 = {};
obj2.a = obj1.a;

// both properties point to the same object.
obj1.a; // {test:123}
obj2.a; // {test:123}

// modify a property of obj1.
obj1.a = 'abc';

// properties point to different objects.
obj1.a; // 'abc'
obj2.a; // {test:123}

这基本上就是你所说的,没有iframe。

所以属性指向到对象,而不是其他属性。 obj1.a = obj2.a不以任何方式链接属性。它只是将两个属性都设置为指向同一个对象。

如果我稍后将其中一个属性指向另一个对象,则不会更改任何其他属性。


但是,如果修改多个属性指向的对象,则可以传播有意义的更改。

var obj1 = {
  a: {test: 123};
}

var obj2 = {};
obj2.a = obj1.a;

// modify a property of the shared object.
obj1.a.test = 456;

// both properties point to the same object.
obj1.a; // {test:456}
obj2.a; // {test:456}

为什么要改变两者?因为在这种情况下,obj1.aobj2.a都引用同一个对象,并且该对象已更改。

这次我们修改共享对象。之前,我们修改了未共享的对象。

看到区别?

答案 1 :(得分:1)

我假设你正在谈论这个:

// Get references to 2 <iframe> nodes
var iframes = document.getElementsByTagName('iframe');
var iframe1 = iframes[0];
var iframe2 = iframes[1];

// Create a custom property
iframe2.map_data = { foo : 'bar' };
iframe1.map_data = iframe2.map_data;
iframe2.src = 'http://microsoft.com';

// This won't change, regardless of 
// loading a new document into iframe2
alert(iframe1.map_data.foo);

即使将新文档加载到该iframe中,iframe2 DOM节点仍将是同一节点。由于您在其上创建了map_data属性,因此它将保持不变。将新文档加载到iframe只会修改框架contentWindow.document,而不是代表主文档上框架的节点。

答案 2 :(得分:0)

这取决于map_data是什么。如果它是一个对象,则是,引用。如果它类似于int,那么不,它被克隆。

var t = {}, u = {};
t.hi = 3;
u.hi = t.hi;
t.hi = 4;
console.log(u.hi); // 3

t.hi = {x:3};
u.hi = t.hi;
console.log(u.hi) // {x : 3}
t.hi.x = 2;
console.log(u.hi) // {x : 2}

t.hi = 3;
console.log(u.hi) // {x : 2}