假设有如下javaScript代码: //Point A: function f(arg){
this.property = arg;
} var a = new f(1); //Point B:我想知道的是:当程序运行到Point B的时候, a对象中的变量arg是否还存在,或是已被销毁?( 请真正了解原理的朋友回答,如果你对自己的答案不是很有把握,请不要回答 )
this.property = arg;
} var a = new f(1); //Point B:我想知道的是:当程序运行到Point B的时候, a对象中的变量arg是否还存在,或是已被销毁?( 请真正了解原理的朋友回答,如果你对自己的答案不是很有把握,请不要回答 )
argthis.property
a作为一个实例化对象是不存在变量arg的,变量arg是在构造函数执行的时候(new f(1))即实例化的时候存在,执行完毕后便已经被销毁。
请看下面的代码:楼主其实应该在这个地方关心变量 i,而不是 arg。
var i = 1;
var a = new f(i);
假如 b 是常量 那么肯定销毁了 没有存在的意义
如果b是一个对象的引用 那么 这个对象还在 但是 b没了
“销毁一个常量”,你确定这句话没有语法问题?如果b是一个对象的引用,那么现在a和b都指向同一个对象了,并且由于a是一个局部变量,所以b的存活时间至少不会少于a。如果b不再有后续的访问,如果有必要的话,编译器毫无疑问会覆盖其所在的寄存器,但这并不表示b就不存在了,这只是一种代码优化技术。我把问题改一下吧: //Point A: function f(arg){
this.property = function{
return arg;
}
} var a = new f(1); //Point B:当然,在这种情况下,arg必然存在。请告诉我,这个对象,和楼顶所说的对象,有何不同?编译器如何区分这两种情形?这个问题可能比较难,但我想得到正确的答案而不是众说纷纭,如果没人知道,我也能够理解。( 请真正了解原理的朋友回答,如果你对自己的答案不是很有把握,请不要回答 )
http://www.nowamagic.net/librarys/veda/detail/1305
“销毁一个常量”,你确定这句话没有语法问题?如果b是一个对象的引用,那么现在a和b都指向同一个对象了,并且由于a是一个局部变量,所以b的存活时间至少不会少于a。如果b不再有后续的访问,如果有必要的话,编译器毫无疑问会覆盖其所在的寄存器,但这并不表示b就不存在了,这只是一种代码优化技术。我把问题改一下吧: //Point A: function f(arg){
this.property = function{
return arg;
}
} var a = new f(1); //Point B:当然,在这种情况下,arg必然存在。请告诉我,这个对象,和楼顶所说的对象,有何不同?编译器如何区分这两种情形?这个问题可能比较难,但我想得到正确的答案而不是众说纷纭,如果没人知道,我也能够理解。( 请真正了解原理的朋友回答,如果你对自己的答案不是很有把握,请不要回答 )
不要咬文嚼字
你可以修改 f 里的代码进行测试 <title>测试GC</title>
<script language="vbs">
Class C
public property get value
value="ok"
end property
Private Sub Class_Terminate
MsgBox("释放了")
End Sub
End Class
function vbObj()
set vbObj= new C
end function
</script>
<button onclick="test()">创建对象</button>
<button onclick="javascript:a=null">主动释放</button>
<script>
var a;
function f(arg){
this.xx=function(){ alert( arg.value ) } //如果这里有引用 不会马上会释放
// this.yy=function(){ alert( eval('1+2') ) } //有eval 的也不会马上释放
//this.zz=function(){} //会马上释放
}
function test(){
var o=vbObj();
a=new f(o);
}
setInterval(CollectGarbage, 500);
</script>
说说我对于各位见解的理解吧: //Point A: function f(arg1, arg2){
arg1 = arg2;
this.property = function{
return arg1;
}
}
var x = {x:'a'}, y = {y:1}; var a = new f(x, y); //Point B:结论:当程序执行到Point B时, arg1的值为{y:1},而arg2的值为undefined。这个结论正确吗?
在ie下测试显示网页有错误:test() 类型不匹配。我想知道,你表达的是不是这么一个意思:在构造函数中的局部变量,被成员引用到的将会被保留,而没有引用的则会被丢弃。
在ie下测试显示网页有错误:test() 类型不匹配。我想知道,你表达的是不是这么一个意思:在构造函数中的局部变量,被成员引用到的将会被保留,而没有引用的则会被丢弃。
应该是说外部有引用到肯定会保留, 我实验用eval() 是表达式,表达式中没有用到,但也没有释放,所以说是可能被引用到了,也不会释放。
我原来在IE10下,现改了下应该兼容低版本的了,你做一下实验就知道了<title>测试GC</title>
<script language="vbs">
Class C
public property get value
value="ok"
end property
Private Sub Class_Terminate
MsgBox("释放了")
End Sub
End Class
function vbObj()
set vbObj= new C
end function
</script>
<button onclick="javascript:test()">创建对象</button>
<button onclick="javascript:a=null">主动释放</button>
<script language="javascript">
var a;
function f(arg){
this.xx=function(){ alert( arg.value ) } //如果这里有引用 不会马上会释放
// this.yy=function(){ alert( eval('1+2') ) } //有eval 的也不会马上释放
//this.zz=function(){} //会马上释放
}
function test(){
var o=vbObj();
a=new f(o);
}
setInterval(CollectGarbage, 500);
</script>