最近做一个项目,碰到了这样一个问题,有两个frame,在不同的page中。
比如global.html
var g_outobj; // ref var from frame.html
function test(obj) // obj 来自于frame.html
{
g_outobj = obj;
g_outobj.str = "changed"; // 我尝试修改它
}
function dump()
{
alert(g_outobj.getstr()); // 看看这个str现在是多少
var obj = g_outobj.checkself(); // 看看对象所在的window是否还存在
}
}
in frame.html
function thisobj()
{
this.str = "this is from frame obj";
this.test = function()
{
alert(this.str);
}
this.getstr = function()
{
return this.str;
}
this.checkself = function()
{
return typeof(window.alert) + typeof(this.str);
}
}
var o = new thisobj();
globalctx.test(o);
alert("after call globalctx.test " + o.str);
delete o;
o = null;
globalctx.dump();
通过这个例子,我得出如下结论:
1. js的变量是带有引用计数的或者类似,即时引用的obj来自于另外的frame(比如global.html)。 这个表示啥呢? 像上例的o 这个对象,即时所在的frame页面被干掉了,那么只要global还在引用这个变量,那么这个js变量就依然存在,无非创建它的window上下文已经消失了。
2. 两个frame实际访问这个对象o的时候,确实是操作了同一个对象,这个可以从修改后str的表现看出。
3. 当frame被干掉后,global中继续访问o or g_outobj 依然可以,只是这个g_outobj 的执行上下文依然在那个已经消失的window中,所以一旦访问window就会出错,比如typeof window就会返回undefined。
阅读(825) | 评论(0) | 转发(0) |