将javascript删除我的var尽管全局引用

时间:2010-08-23 18:30:35

标签: javascript garbage-collection scope

window.global_array = new Array();  
window.example = function()  
{  
     var x = new Object();  
     x['test_property'] = 3;  
     global_array.push(x);  
}

Javascript专家,请回答三个问题:

  1. 当example()返回时,javascript会在范围的末尾删除x,或者将其保存在global_array中。
  2. 我可以安全地假设javascript在python中的工作方式就像'一切都是参考'吗?
  3. 创建的所有虚拟机均相同,或者GC规则因实施而异。

1 个答案:

答案 0 :(得分:4)

  1. 是。 x将被删除,因为它的范围仅限于函数体(您使用var关键字来确保这一点。声明没有var的变量将是全局的,即使在函数体内也是如此。但是, x将继续出现在global_array中。
  2. 不完全。对象(数组也是!)作为引用传递,原始值(如数字)将被复制。
  3. GC会因实施而异,但这不应该是您的担忧。除非存在错误,否则JavaScript实现的行为将相同。
  4. 由于x引用了一个对象,因此赋值(通过push())会增加引用计数。当x超出函数末尾的范围时,这不会将引用计数减少到0,因此对象仍然存在 - 它现在仅在global_array内引用。